Unit3d中的性能優化

性能優化需要從多方面入手,大家在項目中遇到的問題還是很普遍的,歡迎大家補充。


圖形方面:
1. AlphaBlen優於AlphaTest。乍一看,以爲是說錯了,之前在爲性能優化尋找突破點的時候,以爲的在u3d的官方文檔中看到,說是移動設備爲AlphaBlen做了非常多的優化,而使用AlphaTest返回會降低性能,和傳統的端遊圖形有很大不同哦。



內存/顯存的佔用:
1. 盡力少單場景複雜度。RPG遊戲做好場景切割,無論是頁遊的數據分佈加載還是移動設備的小內存限制,都需要做這件事。




遊戲邏輯方面:
1. 在Behavior的Update()中:
a. 只做必要的邏輯 
b.如果一定要頻繁檢查,可以每隔幾幀做一次調用: void Update(){ if( 0 == Time.frameCount%5) DoYourLogic(); } 


2. 定時器
InvokeRepeating("Method name", 0.5, 1.0);


3. 離散的回收垃圾。
void Update() { if(Time.frameCount % 30 == 0) { System.GC.Collect(); } }
穩定的幀速優於大部分很快,偶爾卡一下:
如果我們不離散的做垃圾回收的工作,就會在一些時間點由系統集中的做垃圾回收的操作,當數量很大是,比如話費了30毫秒,那我們的遊戲畫面就會明顯的卡一下。


4. 運行時儘量減少 Tris 和 Draw Calls.
看到大家說要盡力做到:Tris 保持在 7.5k 以下,Draw Calls 保持在 20 以下。
如果場景複雜度很高,比如農場類的遊戲,會有特別龐大的建築和動物類型,因爲貼圖數量激增,材質數量無法避免的增加,DrawCall會很高,那就儘量避免可同時看到的對象數量吧,攝像機儘量拉近。


5. Mesh Compression


6. 避免大量使用 Unity 自帶的 Sphere 等內建 Mesh
U3d中的Mesh三角形數量太多,比如一個矩形的片,用了100個頂點。 建議自行製作簡單的mesh來使用,比如用4個頂點做矩形,如果是用mesh做物理拾取,可以用八邊形(或者是六邊形只要你喜歡)代替圓形。


7. 避免在每幀更新時調用GetComponent
在Awake()中,獲得組件並存在成員變量中,以便隨時取用. 比如UIButton,Translate等。




8. 減少固定增量時間
將固定增量時間值設定在0.04-0.067區間(即,每秒15-25幀)。您可以通過Edit->Project Settings->Time來改變這個值。
這樣做降低了FixedUpdate函數被調用的頻率以及物理引擎執行碰撞檢測與剛體更新的頻率。
如果您使用了較低的固定增量時間,並且在主角身上使用了剛體部件,那麼您可以啓用插值辦法來平滑剛體組件。


9. 避免不必要的分配內存。
爲較少垃圾回收的開銷,我們要儘可能的減少不必要的內存分配。
使用對象池:比如飛機發射的子彈,建築上的收取金幣的圖標,當我們不再使用它時,將它放入對象池並把它移到一個很遠的地方,看不到就好。
  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章