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優化
    更改浮點數

去掉空幀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章