遊戲性能

優化 Cocos2d-x 遊戲性能html

    2016-07-24  html5

     ios

Table of Contents

這篇文章從理論的角度和你們一塊兒來探討一下如何優化 Cocos2d-x 遊戲的性能,這裏面提供的優化技巧並不侷限於使用 Cocos2d-x 引擎製做的遊戲,也適用於其它任何引擎製做的遊戲。

Golden rules

查找遊戲性能瓶頸,而後優化瓶頸

當咱們在作任何性能優化以前,請牢記這條。形成你的系統性能瓶頸的代碼一般只有那 20%的代碼,切莫胡亂優化。

老是使用工具來查找性能瓶頸,而不是靠猜

目前社區裏有許多工具能夠用來查找圖形應用的性能問題。

查找 GPU 性能瓶頸的工具

  1. 使用 Xcode OpenGL ES Profiler。

    文檔連接地址: https://github.com/rstrahl/rudistrahl.me/blob/master/entries/Debugging-OpenGL-ES-With-Xcode-Profile-Tools.md

    這裏是蘋果官方的參考文檔: https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/ToolsOverview/ToolsOverview.html

    若是你想 profiling 特定 GPU 的移動設備的圖形性能,咱們可使用這些 GPU 製造商提供的工具:

  2. 對於 ARM Mali GPU,可使用 mali graphics debugger: http://malideveloper.arm.com/resources/tools/mali-graphics-debugger/

  3. 對於 Imagination PowerVR GPU,可使用 PVRTune: https://community.imgtec.com/developers/powervr/tools/pvrtune/

  4. 對於 Qualcomm Adreno GPU,可使用 adreno GPU profiler: https://developer.qualcomm.com/software/adreno-gpu-profiler

使用這些工具可讓你更清楚地知道你的圖形渲染管線哪一個階段遇到瓶頸了,是頂點處理階段,仍是像素着色階段。

可是,請記住,通常你的遊戲的性能問題可能並不在 GPU,而在 CPU

查找 CPU 性能瓶頸的工具

  1. Mac 平臺可使用 Xcode 的 Time Profiler  工具: https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/MeasuringCPUUse.html

  2. Windows 平臺可使用 Visual  Studio  的 CPU profiler: https://blogs.msdn.microsoft.com/visualstudioalm/2015/10/29/profile-your-cpu-in-the-debugger-in-visual-studio-2015/

  3. Cocos2d-html5 和 Cocos Creator 的用戶,可使用 Chrome(或者 Firefox) 自帶的 timeline 工具和 CPU profile 工具。

熟悉你的移動設備和你使用的遊戲引擎

熟悉你的移動設備使用的 GPU 和 CPU 的型號, Android 手機能夠安裝一個應用「GPU-Z」能夠很是方便地查看到這些信息,而到目前爲止iOS 設備統一使用的都是 PowerVR 的 GPU。若是你在測試遊戲的過程當中,發現其它手機都沒有問題,可是某些具備同種類型的 GPU 的設備性能表現都不佳,此時你可能須要留意一下針對特定 GPU 的優化技巧了。

一樣的,瞭解你所使用的遊戲引擎的侷限也是很是重要的。你須要清楚地知道你所使用的遊戲引擎是如何組織圖形渲染命令的,這些命令又是如何處理 Batch Draw 的。以及,咱們須要如何組織咱們的紋理和遊戲節點對象,這樣才能最大限度地利用引擎提供的自動批處理功能。

若是你知道這些內容,那麼你就能夠避免一些常見的性能瓶頸。

記住"足夠好"原則

什麼是「足夠好「原則?若是遊戲玩家的眼睛不能區分不一樣質量的渲染結果,那麼老是使用更省資源和計算更簡單的實現方法。

咱們都知道,一張像素格式爲 RGBA4444 的圖片在顯示的時候,顯示效果確定是不如一張像素格式爲 RGBA8888 的圖片的。可是,若是咱們使用 RGBA4444 加上「抖動」算法,那麼玩家通常是很難分辨出來的,特別是若是圖片比較小,或者設備分辨率比較低的時候。

一樣的原則也適用於聲音,好比低採樣率的聲音比高採樣率的聲音更省內存和解碼資源,若是玩家分辨不出差異,那麼也要選擇更低採樣率的聲音資源,對於單通道和雙通道聲音也同理。

Common Bottlenecks

按照經驗來講,通常你的遊戲的性能瓶頸都是出如今 CPU 而不是 GPU 上面。

CPU  瓶頸一般跟 Draw call 數量和你的遊戲循環的複雜度相關

因此,你須要儘量地下降你的遊戲的 Draw call 數量,最大限度地利用批次渲染來減小 Draw call 數量。 Cocos2d-x 3.x 包含了自動批處理功能,可是它須要你合圖,而且生成的圖形渲染命令必須相鄰,且有相同的 material id。

對於遊戲中出現的大量對象,好比×××,魚羣等遊戲對象,須要使用內存池技術來避免在遊戲循環中產生大量的 IO 操做。同時,對於遊戲中須要用到的外部資源,好比紋理圖集,聲音文件和 TTF 文件等,儘可能採用預先加載的方式來處理。

同時也千萬要避免在遊戲循環裏面作很是複雜的計算,由於遊戲循環每幀都會執行,因此這些耗時的操做極可能讓你的遊戲的 FPS大大下降。

GPU 瓶頸一般侷限於 Fillrate(Overdraw) 和 Bandwidth

若是你使用 Cocos2d-x 製做 2D 遊戲,你通常不會編寫複雜的 Shader,因此一般你不太會遇到 GPU 相關的性能問題。

可是,Overdraw 這個問題會致使你的 GPU 很容易碰到帶寬的瓶頸,從而下降你的圖形性能。所謂 Overdraw,指的是在圖形渲染管線中,不少像素的着色對於最終顯示在屏幕上的顏色沒有幫助,這些多餘的計算和處理是浪費的,最重要的就是浪費帶寬,由於它們須要從主存中採樣紋理座標。

儘管,現代的移動端 GPU 都有實現 TBDR(Tile-based Defered Rendering),可是隻有 PowerVR的 HSR(隱藏表面剔除)能夠極大地解決 Overdraw 的問題。其它的 GPU 廠商都只實現了 TBDR + Early-Z,若是你按照從前日後的順序提交不透明幾何圖元給 GPU 處理,那麼這些 GPU 的 Overdraw 問題也會減小。

可是,咱們知道 Cocos2d-x 引擎老是按照從後往前的順序去提交圖形渲染命令的,由於在 2D 裏面,大量的圖片都是帶有透明像素的,爲了保證 blending 的正確性,就必須保持這種順序的渲染命令提交。即便按照這種順序去提交渲染命令,PowerVR 的 HSR 也能夠在片段着色以前剔除掉不須要計算的像素。這也是爲何一樣的 Cocos2d-x 遊戲在很垃圾的 iPod 上面性能也不錯,可是在某些 Android 旗艦機上面性能卻表現得一團糟的緣由。

注意: 經過使用工具, 預先將 2D 圖片三角化,能夠提升 Fillrate。

具體作法能夠參考 TexturePacker 做者寫的文章: https://www.codeandweb.com/texturepacker/tutorials/cocos2d-x-performance-optimization

Simple checklist to make your Cocos2d-x game faster

  1. 儘量地使用批次渲染(Batch Draw)

  2. 按照經驗,儘量把你的 Draw 數量控制在 50 如下

  3. 減小 32 位未壓縮紋理的使用,儘可能使用 16 位且壓縮過的紋理格式。

  4. 儘量地使用支持硬件解碼的壓縮紋理:好比 iOS 平臺使用 PVRTC 紋理, 在安卓平臺上面使用 ETC格式的紋理。目前全部的 Android 設備都是支持 ETC1 格式的紋理的,可是此紋理格式不支持 Alpha,因此你須要修改一下引擎以使用 ETC1 格式的紋理。

  5. 不要使用系統字體來動態顯示你的遊戲中的分數等信息,請使用 BMFont 字體。

  6. 請使用對象池和預加載技術來避免臨時卡頓。

  7. 使用 armeabi-v7a 架構來編譯 Android 的 SO,由於在此架構下面 Cocos2d-x 會啓用 neon 指令集,矩陣運算的效率會大大提升。

  8. 不要使用動態光照,儘可能使用 bake 光照。

  9. 避免在 pixel shader 裏面作很是複雜的計算

  10. 避免在 pixel shader 裏面使用 discard 和 alpha test,由於這樣會破壞 GPU 自身的 depth testing 優化,好比 PowerVR 的 HSR。

相關文章
相關標籤/搜索