Unity最佳化總結

來源:互聯網
上載者:User

    我們的遊戲已經在wp8、ios和android平台上線了。這是我做的第一個Unity項目,期間遇到過不少困難和挫折,但是我和小夥伴們一路摸索,現在,遊戲已經上線一段時間,並且很穩定。對於Unity,我一直在項目中學習,我會寫一系列的文章記錄自己的學習,希望看到文章的朋友多多交流。


    項目中後期,我做了一些最佳化工作,這裡記錄總結一下。


一、紋理壓縮格式

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


    在ios裝置上,建議選擇PVR格式。wp8和win8裝置上,DXT格式。android裝置,不透明貼圖選擇通用支援的ETC格式;而透明貼圖,4大GPU廠商各自有自己的壓縮格式,可以選擇RGBA16。


    實測效果:顯著提高渲染表現。我第一次打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左右!要命的是我們沒有美術,美術都是外包的,外包那邊的同學不懂移動平台的最佳化。我找了一些美術最佳化的文章發給他,估計他也沒看懂,他改了幾次,渲染表現沒有任何改善。最後只能我自己上陣了,我看不懂那些種類繁多的美術資源,採用最笨的二分法,最後查到一個水花濺起的煙霧效果是效能瓶頸。這個效果的表現力很弱,跟產品、策劃和美術商量之後把這個效果關閉了。然後,比S4次很多的手機也能跑滿60FPS了。


5. 指令碼最佳化

    很多時候,效能瓶頸點不在於渲染,而是指令碼代碼!我們要刪除指令碼中為空白或不需要的預設方法,盡量少在Update中做事情,指令碼不用時把它deactive。


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


6. 資源卸載、記憶體回收

   策劃的同學反饋過,戰鬥的時候,偶爾會卡頓。仔細觀察之後發現,是有規律的定時卡頓,然後檢查代碼發現,出於記憶體最佳化考慮,terender同學設計了每30秒自動進行一次資源卸載,資源卸載有時候還會觸發GC.Collect()。改為進、出戰場時卸載資源,而戰鬥中不再卸載,解決了偶爾卡頓的問題。


7. 資源預先載入

    以空間換時間的方法。進入戰場時,預先載入戰鬥特效和卡牌,減少載入卡牌和發動技能時的幀數下降。這個地方,我最開始寫成了阻塞式,後來發現會影響玩家進入戰場的體驗,改成了非阻塞的,用協程逐個載入。


8. 最佳化戰鬥卡牌渲染

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


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


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


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


                                               

                     最佳化前,場上12張卡牌,FPS 112.7                                                                                 最佳化後,場上14張卡牌,FPS 208.6
                     DrawCall 70,Tris 2.1k,Verts 3.7k                                                                                DrawCall 47,Tris 1.4k,Verts 2.3k

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


    以上就是我在做我們的項目時,摸索出的適合我們遊戲的一些Unity最佳化方案。因為我們的遊戲是2D的,所以可能對於3D遊戲的最佳化,有些方案可能並不適用,也不夠全面。目前有些地方,我們做的也不是很好,最佳化是一項長期、持續的工作,後面我還會一直進行下去。


    下一篇文章預告:Unity自動打包工具,可以一鍵打包幾十個渠道/平台。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.