2014年10月9日 星期四

在WebGL上的Unity性能跑分


原文網址:http://blogs.unity3d.com/2014/10/07/benchmarking-unity-performance-in-webgl/
作者:JONAS ECHTERHOFF

Unity 即將支援的一個振奮人心的新平臺就是WebGL。我們將Unity專案移植到新的平臺時,一個很重要的問題,就是搞清楚專案在WebGL上校能,並看看能否讓它的校能更快。

談到校能,WebGL很特別,原因如下:所有的程式碼都需要被交叉編譯為JavaScript,一些常見的加強效能的技術尚未支援,例如多執行緒和SIMD(單指令流多資料流程)。我們依靠一個全新的IL2Cpp方案來執行腳本。所以我們要探悉的是:對於玩遊戲來說它的效率夠快嗎?在不同的瀏覽器和硬體中如何比較呢?什麼樣的編譯設定會產生最好的結果呢?

這些問題我們也曾無數遍地問過自己,並且經常有客戶和廠商追問我們關於WebGL的進展。最直接的方法是在WebGL中執行Unity的專案然後監測FPS。我們發現測試過的大部分內容,其FPS都能達到原生的至少50%(這取決於很多因素,例如所使用的瀏覽器)。你可以測試這裡提供的兩個遊戲Demo。

然而,我們希望得到精准可靠的資料。哪些模組在WebGL中特別慢,那些又比較快呢?不同的實現方式之間又有什麼區別呢?

為了找出答案,我們創建了Unity Benchmarks,它是一套在Unity中編寫的測試套件。這些測試項目著重於引擎不同的功能,並產生易於比較的校能資料。點此連結試試在你的瀏覽器中執行WebGL的Unity Benchmarks吧! (請注意,Windows系統可能會有一些超高的錯誤分數會出現在
Mandelbrot GPU這項測試,因為它們渲染shader的方式不對。我們正在研究該問題並找出解決方案。)
物理效能測試

Unity Benchmarks有分別針對3D物理、2D物理、粒子系統、導航、動畫和皮膚、初始化物件、腳本、draw calls和GPU圖元處理的不同測試項目。每個測試都會計算固定時間內Unity能重複執行的任務的次數。對於產生的資料數字越大表示性能越好。

如果你執行所有的測試,它會給出總分數。該分數是所有基準測試分數的加權總和。由於不同的基準測試有著完全不同的結果,所以總分中它們有不一樣的權重。該權重以WebGL中測試機器產生的近似結果來校準。但那多少有些隨便,所以在比較結果時,各項測試的分數要比總分有價值多了!

解釋了這麼多之後,下面是一些測試結果(所有的測試都在15寸Retina的MacBook Pro上執行,CPU 2.6GHz,i7,作業系統OS X 10.10):


為了讓圖表更好懂,分數都做了等比縮放,FireFox = 1.0。分數越高表示性能越好。

一些觀察結果:

· 在大多數測試中,Firefox使用的asm.js在幾乎所有的測試都比Chorme和Safari更快,它是目前最適合跑Unity WebGL內容的瀏覽器。希望不久的將來,asm.js也能在其它瀏覽上跑。

· 如果你的程式大多是GPU-bound(GPU性能瓶頸)的,可以期待WenGL的校能將非常接近原生程式。

· 在某些地方WebGL的效率會高出原生碼。這是針對測試項目大量依賴腳本校能的情況(Mandelbrot 和CryptoHash, 都是使用C#實現了他們的演算法),因為IL2Cpp可以產生優化更多的程式(希望瞭解更多,之前有發佈過一篇關於IL2Cpp的文章)。

· 在一些大量優化過使用多執行緒和SIMD的地方,原生碼的效率還是可以高出WebGL好幾倍,例如3D物理測試(Unity5中的PhysX3.3是完全支援多執行緒的)。與之相比,2D物理測試在Firefox與原生碼中的效率就比較接近 (Box2D不支持多執行緒)。希望在不久的將來,JavaScript能支持SIMD和多執行緒,這一點就會改變。

最重要的一點是,儘管WebGL還存在一些比原生碼慢的地方,總體上的校能已經非常不俗了,並且未來還會往更好的方向發展。我希望這些測試可以幫助到那些希望優化自己的JS引擎和WebGL實踐的開發者們。

1 則留言:

著作人