Unity3D優化總結(一)


 

容易忽略的美術資源的優化:

        優化的美術制作真是一種感覺和經驗的積累,能看出制作水平的不是做的效果多么犀利,而是得看制作的效果與對機器的要求等的性價比。

  • 關於合並:  100個三角形的MESH,在渲染時與1500個面數的物體是沒太大差別的,最佳的渲染設置應該在每個模型大約1500-4000個三角面。
  • 材質共享:  如果需要通過腳本來訪問復用材質屬性,改變Renderer.material將會造成一份材質的拷貝。應該使用Renderer.sharedMaterial來保證材質的共享狀態。
  • 批處理動態物體需要在每個頂點上進行一定的開銷,也有一些約束:
    1. 對VB的顯存大小也有一定限制,如果着色器使用頂點位置,法線和UV值三種屬性,那么只能批處理300頂點以下的物體;如果着色器需要使用頂點位置,法線,UV0,UV1和切向量,那只能批處理180頂點以下的物體了。
    2. 擁有lightmap的物體含有額外(隱藏)的材質屬性,比如:lightmap的偏移和縮放系數等。所以,擁有lightmap的物體將不會進行批處理(除非他們指向lightmap的同一部分)。
    3. 使用不同縮放(scale)的物體將不能批次。分別擁有縮放尺度(1,1,1)和(2,2,2)的兩個物體將不會進行批處理。
    4. 另外一個值得吸收的經驗是非均勻縮放動畫在unity中非常的慢,均勻縮放會快很多。
  • 骨骼數量控制:一般來說游戲中的骨骼數量為15-60個。骨骼越少運行速度越快,一般來說30塊骨骼就可以讓角色動的很舒服了。建議每個角色30個骨骼,就按照這個規范吧。
  • 嘗試用壓縮貼圖格式,或用16位代替32位。

 

程序開發層面的注意點:

  1. 垃圾回收器收集垃圾內存時負載較大,對移動設備是個大問題,因此要從代碼層面減少臨時內存的生成,

           1)         移除代碼中的任何字符串連接,因為這會給GC留下大量垃圾。

           2)         用簡單的“for”循環代替“foreach”循環。由於某些原因,每個“foreach”循環的每次迭代會生成24字節的垃圾內存。一個簡單的循環迭代10次就可以留下240字節的垃圾內存。

           3)         更改我們檢查游戲對象標簽的方法。用“if (go.CompareTag (“Enemy”)”來代替“if (go.tag == “Enemy”)”

  1. 使用#pragma strict 簡單的添加#pragma strict在腳本頂部,之后Unity將禁用腳本的動態類型,強制你使用靜態類型。
  2. 緩存各種組件、Object查找
  3. 盡量使用固定的內置數組:內置數組是非常快的。ArrayList或Array類很容易使用,更方便使用。但是他們有完全不同的速度。內置數組還有好處是,內存連續,元素對齊。
  4. 不要使用System,System.Xml以及其他系統自帶的DLL,會多出幾兆空間,找找開源的。
  5. 盡量采用內置的高效的shader吧,例如(built-in)Shader mobile,如果自己寫,復雜的數學計算函數別用,alphatest慎重(美術幾何挖洞來實現吧)。shader中注意float/half/fixed的使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM