天天看點

Unity遊戲後期優化

1.1 開發中的重點問題

兩個瓶頸

Cpu向Gpu發送指令,每發送一次資料,稱為DrawCall(DC)

Cpu從硬碟讀取,處理高并發與并行計算(I/O)

1.2 優化時針對的點

Mesh

Matirial(紋理,shader)

以上兩條任意一個發生變化,就會重新産生一個DC,是以我們優化的時候主要針對它們

  1. 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

  1. 模型的優化
  2. 和 法線貼圖

normalmap:針對頂點的法線貼圖

法線貼圖:針對像素的法線

  1. Animation優化

    更改浮點數

去掉空幀