Unity優化總結

一、紋理壓縮格式

    非GPU支持的紋理格式,需要經過CPU解碼;而GPU支持的紋理格式,GPU直接解碼和顯示,GPU的解碼有很多優化,隨機訪問、快速尋址和並行解碼等,因此效率高得多。而且,壓縮過的紋理文件通常更小,比如ETC1是8:1的壓縮比,文件小就意味着加載更快,更節約系統帶寬。在手機上對比測試一下加載一個1MB的文件和一個8MB文件的耗時吧。

    在iOS設備上,請使用PVR格式。wp8和win8設備上,DXT格式。Android設備,不透明貼圖選擇通用支持的ETC1格式;而透明貼圖,4大GPU廠商各自有自己的壓縮格式,可以把貼圖分成一張RGB圖和一張alpha通道圖,都用ETC1格式,遊戲裏再合成;也可以簡單選擇RGBA4444格式。

    實測效果:顯著提高渲染表現。我第一次打wp8包在lumia 520上運行,比較卡,聲音有卡頓;改紋理壓縮格式爲DXT1/DXT5之後,在lumia 520上運行比較流暢,聲音卡頓現象也沒有了。

    另外,貼圖建議做成方形的,一般不要超過1024x1024。我們最初在lumia 520上偶爾有紋理丟失現象,後來我把幾個2048的貼圖拆成1024x1024的,問題再也沒有出現過,原因沒搞明白,知道的朋友朋友請不吝賜教。

2. 限幀

    在移動設備上,Unity默認是60幀/秒,建議關掉垂直同步,把FPS限爲30,進入後臺時爲1。限幀可以顯著的減少發熱和耗電。

3. 圖集/材質/Mesh合併
    我僅僅通過優化圖集,就將遊戲的內存佔用降低了30M。而且,因爲DrawCall減少了,遊戲中一個比較複雜的關卡列表界面,渲染耗時減少了一半。

4. 資源優化
    我們的戰鬥場景是3D的,我測試的時候發現這個3D場景渲染表現很差,打開戰鬥場景,在Galaxy S4上竟然只有35FPS左右!要命的是我們沒有美術,美術都是外包的,外包那邊的同學不懂移動平臺的優化。我找了一些美術優化的文章發給他,估計他也沒看懂,他改了幾次,渲染表現沒有任何改善。最後只能我自己上陣了,我看不懂那些種類繁多的美術資源,採用最笨的二分法,最後查到一個水花濺起的煙霧(Fog)效果是性能瓶頸。這個效果的表現力很弱,跟產品、策劃和美術商量之後把這個效果關閉了。然後,比S4配置差很多的手機也能跑滿60FPS了。

5. 腳本優化

    很多時候,性能瓶頸點不在於渲染,而是腳本代碼!我們要刪除腳本中爲空或不需要的默認方法,儘量少在Update中做事情,腳本不用時把它deactive。

    經過以上五步優化之後,在lumia 520,iphone 4和三星9100上測試,遊戲都可以達到60FPS,滿足了上線需求。但是,因爲戰鬥場景元素最多,渲染表現最差,而且玩家在戰鬥場景中的時間最長,我後面又針對戰鬥做了一些優化。

6. 資源卸載、垃圾回收

   策劃的同學反饋過,戰鬥的時候,偶爾會卡頓。觀察發現,是有規律的定時卡頓,針對加載的Assets,我們每30秒自動進行一次資源卸載(UnloadUnusedAssets),有時還會觸發垃圾收集(GC.Collect)。改爲進、出戰場時卸載未被引用的資源,而戰鬥中不再定時卸載,解決了偶爾卡頓的問題。

7. 資源預加載

    以空間換時間的方法。創建一張新卡牌或特效時,掉幀明顯,改爲進入戰場時,預加載卡牌和技能特效資源,效果很好。

8. 優化戰鬥卡牌渲染

    經過前面那些優化之後,我仍然不滿足,一直在尋求繼續的優化,讓玩家的戰鬥體驗可以更好。

    我們戰鬥時DrawCall能達到120個左右,我一直在考慮怎麼降低DrawCall,3D場景佔了20多個,這塊沒法優化了(沒有美術啊%>_<%)。我就把目光盯向卡牌,戰場上最多可以有20張卡牌,所以,卡牌是DrawCall的“貢獻大戶”。先問問策劃,卡牌上是否有可以不顯示或者合併的內容,策劃的同學們寸步不讓。吃了閉門羹,只能回來自己琢磨,後來終於想到,顯示的內容我無法減少,但是我可以把所有的內容渲染到一起,這樣以後繪製時只需要繪製渲染出的紋理而不需要繪製卡牌上“零散”的內容。

    卡牌上有卡像、卡框、種族、等級、名字、等級、攻/防等,貢獻了5~6個DrawCall,而這些內容除了攻/防數字,別的內容在戰鬥時都不會改變,把他們渲到一張新紋理上,DrawCall就只有2個了:新紋理和攻/防數字!ps: 攻/防數字也可以和別的內容渲染到一起,相對遊戲的幀率,數字改變並不算頻繁,每次數字改變重新繪製並不會帶來顯著的開銷。

    想明白之後,實現就很簡單了。然後,分別打了wp8、ios和android包在相應設備上測試。測試結果:DrawCall降低了一半,幀數提高到了原來的2倍。而且,之前一直未較好解決的發熱問題,完全解決了。在戰場中打了30多分鐘,lumia 520、Galaxy S4和iPhone 4s微微溫,iPod Touch5沒有發溫。對比了一下當前正火的《刀塔傳奇》,完勝:-D。

    從上面的對比圖可以看到,渲染優化之後,雖然卡牌更多,但是FPS仍然提升了近一倍,優化的效果非常好。卡牌越多,優化的效果會越顯著。

9. 優化NGUI

    NGUI有些地方效率很低。

    1). 動畫。如果有動畫,NGUI可能會重建動畫控件所在的整個UIPanel的DrawCall,對CPU開銷很大。所以,如果有動畫控件,一定要把它單獨掛到一個UIPanel下。

    2). 錨點。UIAnchor每一幀就重算位置信息,so foolish!只需要初始化和窗口大小變化的時候計算就好(對於移動遊戲窗口大小不會變化^_^)。

    3). 列表。NGUI列表(UIGrid+UIDragablePanel, ver2.6)如果放子item較多,會非常卡,比如你加了100個好友/有100張卡牌,不僅掉幀厲害,拖動的時候也非常卡。可以根據顯示需要,創建出顯示個數+x個子item,循環重複利用。通訊類app比如微信、QQ、通訊錄應該都是這麼優化的。

    4). 其它。可以在一些性能瓶頸點用Unity原生方式實現,代替使用NGUI。我們的主場景是可拖動的長條形地圖,最開始做的同學直接用NGUI列表來做,後來我測試發現這裏是嚴重的性能瓶頸,改用Unity SpriteRenderer實現,根據需要自己做拖動、點擊(不規則地圖,多邊形碰撞盒),效率提升非常明顯。
發佈了22 篇原創文章 · 獲贊 24 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章