1.1 開發中的重點問題
兩個瓶頸
Cpu向Gpu發送指令,每發送一次資料,稱為DrawCall(DC)
Cpu從硬碟讀取,處理高并發與并行計算(I/O)
1.2 優化時針對的點
Mesh
Matirial(紋理,shader)
以上兩條任意一個發生變化,就會重新産生一個DC,是以我們優化的時候主要針對它們
-
UI優化
2.1 搭UI的時候需要注意的問題
2.1.1 UI層級計算
NGUI的渲染機關是panel,UGUI的渲染機關是Canvas,每建一個Canvas至少增加一個DC
如果UI下面沒有子物體,層級為0
用了同一個材質球、紋理的UI,可以同一批送去GPU
2.1.2 UI重建
已經通過了DC,後期修改了它的位置
Canvas将子物體的頂點、mesh和material收集起來,發給GPU
位置盡量不動
動态靜态分離
隐藏的方式
setActive = false
移走
不同的層
2.1.3 UI重繪
指重複的渲染UI,UI沒有深度,有多少層渲染多少,影響GBuffer
2.2 其他問題
在記憶體允許的情況下,對于UI界面進行緩存
根據UI界面的使用頻率,分層處理UI界面
粒子保持在400以下
3 記憶體優化
3.1 三塊記憶體
C#程式編碼記憶體
腳本
Unity編碼記憶體
GameObject中的Mesh和Material
托管堆與非托管堆
類似C/C++ 中申請記憶體的malloc/new 和釋放記憶體free/delete
安全代碼堆:托管堆
由C#進行計數管理
非安全代碼堆:非托管堆
自己建立的自己釋放
3.2 三塊記憶體的優化
string與stringBuilder
for與foreach
updata
盡量減少函數調用,如用 x = x > 0 ? x : -x 替換 x = Mathf.Abs(x),減少棧的使用
struct指派,不用整體的拷貝,裡面的屬性每條指派減少記憶體使用
某些函數可以每幾幀調用,InvokeRepeating
updata中盡量不用臨時變量,因為每幀都申請釋放,都要做垃圾回收
定時進行垃圾回收 GC.collection
優化數學運算,盡量避免使用float改用int
王者榮耀的幀同步處理方式
樂觀鎖
将除法轉成乘法
壓縮Unity自帶的庫函數 ios空工程17mb 安卓空工程10mb
- 模型的優化
- 和 法線貼圖
normalmap:針對頂點的法線貼圖
法線貼圖:針對像素的法線
-
Animation優化
更改浮點數
去掉空幀