Unity3D是怎麼提升遊戲運行效率的?

Unity3D可以用C#和JS作為開發語言,這兩種語言開發效率是蠻高,但運行效率應該不會比Java好多少吧?

PC遊戲據說為了性能,大多是用C++開發的;Unity3D主打是手機遊戲,卻選擇了C#/JS;

難道它們有什麼黑科技?


誰說Unity3D不是C++的?

對性能特別敏感的部分,Unity已經用C++幫你做了,C#和JS主要用途是寫遊戲邏輯,而不是複雜的計算。一般的遊戲的邏輯部分很少會是性能瓶頸

哦對,U3D後續版本引入了IL2CPP


現在手游開發重視的是開發效率,比如現在流行的是cocos2dx+lua,而不是直接使用c++。因為有人員門檻、開發效率、熱更新等優勢。

而邏輯產生的性能問題都是很容易定位和解決的。實際核心圖形、物理相關的內容,Unity是使用c++,而且肯定做過很多的性能優化。


針對這個問題,Unity使用C#、JS和Boo這三種語言來作為開發語言,首先是Mono這個跨平台工具決定的,即Mono支持什麼樣的語言,從官方文檔中你可以了解到Mono支持C#、Visual Basic、JavaScript、Python、Boo等語言,而在這其中相對優秀的C#毫無疑問地成為了首選的開發語言。

Unity本身採用C++寫的,腳本語言這種形式在遊戲開發中是特別常見的,因為腳本語言存在的意義是為了提高開發效率,就像cocos2d-X引擎同時存在C++、JavaScript、Lua三種語言的綁定,從效率上來講C++更高效,但是從用戶友好和開發效率上來講,Lua和JavaScript顯然更好。

所以在這個問題上,主要有兩點:Mono決定了Unity選擇C#作為開發語言,C#可以降低引擎門檻、提高開發效率。

在目前這樣一個硬體能力過剩的時代,我覺得稍微犧牲點性能來滿足快速迭代的開發需求,比過度追求性能上的優化有意義的多。天下武功,唯快不破,C++顯然是無法滿足國內手游短、平、快的市場現狀的啊……對Java我想說,如果Java有意向在Mono上跑,我們可以考慮幫你們移植,畢竟你們的JVM被改得連你們都不認識了:(逃


據本文發稿時, Unity3D已經引入了IL2CPP技術, 性能提高數倍. 而且可以跨過mono的VM跨平台兼容性維護問題

C#比java晚出, MS在開發過程中各種跪舔開發者, 據說一個類庫的函數命名, 都是問開發者. 怎麼爽怎麼來. 性能自然比java要優越很多. 別忘了, C#的設計者也是Delphi的設計者

雖然mono不是MS出的, 但是從社區統計數據來看, 也絕對不是java能比的. 你看Unity3D出來後, 是吐槽C#性能低的多還是吐槽安卓java效率低的多(笑話)

io永遠是程序的性能屏障, Unity3D在這塊幫你用native方式解決了.所以C#那點性能損失算不了啥


用c#寫的i++和c寫的i++,編譯後的機器指令哪個更快?

實際測試,il2cpp之後,同樣的代碼,非但沒有提高性能,反而降低了性能,而且還有很多bug。unity不知道為啥要搞這個腦殘項目,可能是要用到某個c++轉js的項目來實現webgl,提高性能絕對是扯淡。把il轉成c++,實現不是那麼簡單,沒有找到最佳實現,肯定會浪費性能的。

很多人以為,arm指令集會比intel指令集有功耗優勢,實際上不是。

很多人以為,c++一定比c#快,其實也不是。有些操作c#快,有些c++快,編譯器優化方向不同而已。沒有哪個是絕對優勢。

拿一大段代碼用不同語言實現去比較編程語言是腦袋電路不通。兩團亂麻哪個更直?邏輯正常應該用單項操作去比較。比如字元串操作,整數運算,浮點運算,內存分配以及回收。不用說也知道內存管理是gc語言的長項。

經過測試,c++在浮點運算上領先,c#字元串處理較快。

不信邪的人,可以用c#和c分別寫個Fibonacci的遞歸實現,看看是哪個快。

我記得以前是mono比c#快,然後是c++,最後是java。c#如果做了native就跟mono速度差不多。

拿啟動時間相差零點幾秒來證明是無聊。運行速度快就行了。啟動差0.1秒感覺得出來嗎。c++編譯還要幾個小時呢。

真做事情,肯定是盡量用c#和java,沒有辦法的時候用c++和c。性能差不多,花錢越少越好。吹牛嘛,用彙編big更高。


你可以去看leetcode上面Java和C#的運行時間分布表,然後再來說什麼【運行效率應該不會比Java好多少吧】

針對你這個問題,大概就是,現在的設備對於unity的遊戲來說,計算資源還是過剩的,所以不需要C++也可以。同理也沒人會用unity開發Crysis的。


HTML5 的 WebGL 我們還拿來做 Ray Tracing Assignment 呢…把初始化和一些計算放 JS 里,剩下的交給 shader,帶 procedural texture 的,算上 reflection 和 refraction 照樣輕鬆做到 60 fps……嘛當然我更喜歡用 C++ 來寫 OpenGL 不過教授不讓啊…

話說 C# 應該比 Java 快多了吧。


如輪子哥說的,現在來說,計算資源是過剩的。最重要是的在內存上的優化,gpu上的優化。


推薦閱讀:

為什麼現在做手游還要壓縮遊戲包的大小?
怎樣在《LoveLive! 學園偶像祭》活動中獲得最大的收益?
kiip模式是否會對中國手游界形成強烈衝擊?大大改善手游界?
遊戲從業者如何看《陰陽師》用戶的快速流失?
陰陽師中百鬼夜行有沒有什麼技巧?

TAG:編程語言 | 遊戲開發 | 手機遊戲 | Unity遊戲引擎 |