unity在移動裝置上的優化
http://www.cnblogs.com/123ing/p/4130034.html
http://www.cnblogs.com/123ing/p/4130034.html
轉自:UNITY3d在移動裝置上的一些優化實戰(一)-概述 http://blog.csdn.net/leonwei/article/details/39233921
專案進入了中期之後,就需要對程式在移動裝置上的表現做分析評估和針對性的優化了,首先前期做優化,很多瓶頸沒表現出來,能做的東西不多,而且很多指標會憑預想,如果太后期做優化又會太晚,到時發現一些問題改起來返工量就有太大。前一陣子花了大量時間從 cpu gpu 記憶體 啟動時間 到發熱量對專案做了一翻大規模的體檢和優化,效果還是顯著的,在這裡做個筆記,以後開發專案時可以作為經驗和提前關注
1.專案情況:筆者所在專案是一個非常重度的手遊,甚至開始就是瞄著端遊做的,3D世界,2.5D視角,RPG,即使戰鬥,美術品質要求極高(模型 貼圖精度高 ,超過目前市場同類產品)。對於目前大多數移動裝置來看,挑戰不小,對手機的各種硬體都是挑戰。、
2.目標機型:偏中高階,儘量相容低端,android至少sumsung S3能流暢,ios至少iphone4s流暢。
3.效能指標:記憶體佔用250M以下(這樣大量512的機器不會掛掉),初始包100m之內(太多運營不幹,太少實在是裝不下。。)
用於分析和測試效能的一些利器:
1.首先是unity在編輯器下的statics視窗:提供了dc和頂點數這兩個重要指標的檢視。缺點在裝置看不到,但是對於dc數和頂點數來說,裝置和編輯器差不多,用它可以大體看出渲染的壓力。
2.unity自帶的profiler:可以連線裝置看到裝置上cpu gpu mem的資訊,使用的時候需要勾選development模式。有點是cpu的佔用在指令碼的層面看的非常仔細,哪個函式佔用了太多時間一眼就能看出,基本是分析指令碼效率的最佳工具,但是gpu大部分裝置不支援看不到,顯示的mem資訊不太準確,基本上偏離實際佔用的記憶體
3.unity的internal profiler:在playersetting上可以勾選這個選項,勾選後,連線裝置,在android的adb或者mac的xcode裡會每隔幾秒打印出很多關鍵指標,這個其實非常有用,不過這個功能直到很後期才發現,詳細文件見
adb shell dumpsys cpuinfo appname 檢視實時的cpu佔用,注意這裡的cpu可能過百,這是因為多核的原因
adb shell dumpsys gpuinfo appname 檢視實時的gpu情況
5.android 的monitor
安裝adt後,在sdk\tools\monitor.bat下面有個monitor,是我認為android看效能最好的工具之一,因為它是圖形化的,而且基本集成了adb的功能,從記憶體到cpu到gpu,還有很有用的網路流量使用情況,它的cpu佔用是c++層面的統計,看不到指令碼,這需要突破那個profilor結合。
6.android上的mongkey測試:它可以模擬隨機的使用者輸入,用來驗證你的程式的強壯性吧
adb shell monkey -p -v packname 1000
隨機模擬1000條使用者事件
7.ios:ios上的工具則顯得更加專業更加統一一些,ios就用xcode自帶的instruments了
看來這麼多工具,其實很多是要配合使用的,做u3d開發,其實不只是學會U3D的事情,要讓U3D在手機上執行的好,還需要對各個平臺有較深的瞭解。
利用這些工具法線了一些瓶頸,同時也採取了各種策略來提高效能,反正目標就是cpu佔用降低,記憶體佔用減少,啟動快,發熱小,幀率高,GPU佔用少,發現的一些問題和做出的具體的一些努力列舉如下:
1.使用assetbundle,實現資源分離和共享,將記憶體控制到200m之內,同時也可以實現資源的線上更新
2.頂點數對渲染無論是cpu還是gpu都是壓力最大的貢獻者,降低頂點數到8萬以下,fps穩定到了30幀左右
3.只使用一盞動態光,不是用陰影,不使用光照探頭
粒子系統是cpu上的大頭
4.剪裁粒子系統 5.合併同時出現的粒子系統 6.自己實現輕量級的粒子系統 animator也是一個效率奇差的地方 7.把不需要跟骨骼動畫和動作過渡的地方全部使用animation,控制骨骼數量在30根以下 8.animator出視野不更新 9.刪除無意義的animator 10.animator的初始化很耗時(粒子上能不能儘量不用animator) 11.除主角外都不要跟骨骼運動apply root motion 12.絕對禁止掉那些不帶剛體帶包圍盒的物體(static collider )運動 NUGI的程式碼效率很差,基本上runtime的時候對cpu的貢獻和render不相上下 13每幀遞迴的計算finalalpha改為只有初始化和變動時計算 14去掉法線計算 15不要每幀計算viewsize 和windowsize 16filldrawcall時構建頂點快取使用array.copy 17.程式碼剪裁:使用strip level ,使用.net2.0 subset 18.儘量減少smooth group 19.給美術定一個嚴格的經過科學驗證的美術標準,並在U3D裡面配以相應的檢查工具 後面的文章會對這些點做以更詳細的討論