1. 概述
1.1 開(kāi)發(fā)中的重點(diǎn)問(wèn)題
兩個(gè)瓶頸
- Cpu向Gpu發(fā)送指令,每發(fā)送一次數(shù)據(jù),稱為DrawCall(DC)
- Cpu從硬盤(pán)讀取,處理高并發(fā)與并行計(jì)算(I/O)
1.2 優(yōu)化時(shí)針對(duì)的點(diǎn)
- Mesh
- Matirial(紋理,shader)
以上兩條任意一個(gè)發(fā)生變化,就會(huì)重新產(chǎn)生一個(gè)DC,所以我們優(yōu)化的時(shí)候主要針對(duì)它們
2. UI優(yōu)化
2.1 搭UI的時(shí)候需要注意的問(wèn)題
2.1.1 UI層級(jí)計(jì)算
NGUI的渲染單位是panel,UGUI的渲染單位是Canvas,每建一個(gè)Canvas至少增加一個(gè)DC
- 如果UI下面沒(méi)有子物體,層級(jí)為0
- 用了同一個(gè)材質(zhì)球、紋理的UI,可以同一批送去GPU
2.1.2 UI重建
已經(jīng)通過(guò)了DC,后期修改了它的位置
Canvas將子物體的頂點(diǎn)、mesh和material收集起來(lái),發(fā)給GPU
- 位置盡量不動(dòng)
- 動(dòng)態(tài)靜態(tài)分離
- 隱藏的方式
- setActive = false
- 移走
- 不同的層
2.1.3 UI重繪
指重復(fù)的渲染UI,UI沒(méi)有深度,有多少層渲染多少,影響GBuffer
2.2 其他問(wèn)題
- 在內(nèi)存允許的情況下,對(duì)于UI界面進(jìn)行緩存
- 根據(jù)UI界面的使用頻率,分層處理UI界面
- 粒子保持在400以下
3 內(nèi)存優(yōu)化
3.1 三塊內(nèi)存
- C#程序編碼內(nèi)存
- 腳本
- Unity編碼內(nèi)存
- GameObject中的Mesh和Material
- 托管堆與非托管堆
類似C/C++ 中申請(qǐng)內(nèi)存的malloc/new 和釋放內(nèi)存free/delete- 安全代碼堆:托管堆
由C#進(jìn)行計(jì)數(shù)管理 - 非安全代碼堆:非托管堆
自己創(chuàng)建的自己釋放
- 安全代碼堆:托管堆
3.2 三塊內(nèi)存的優(yōu)化
- string與stringBuilder
- for與foreach
- updata
- 盡量減少函數(shù)調(diào)用,如用 x = x > 0 ? x : -x 替換 x = Mathf.Abs(x),減少棧的使用
- struct賦值,不用整體的拷貝,里面的屬性每條賦值減少內(nèi)存使用
- 某些函數(shù)可以每幾幀調(diào)用,InvokeRepeating
- updata中盡量不用臨時(shí)變量,因?yàn)槊繋忌暾?qǐng)釋放,都要做垃圾回收
- 定時(shí)進(jìn)行垃圾回收 GC.collection
- 優(yōu)化數(shù)學(xué)運(yùn)算,盡量避免使用float改用int
- 王者榮耀的幀同步處理方式
- 樂(lè)觀鎖
- 將除法轉(zhuǎn)成乘法
- 壓縮Unity自帶的庫(kù)函數(shù) ios空工程17mb 安卓空工程10mb
4. 模型的優(yōu)化
- normalmap 和 法線貼圖
- normalmap:針對(duì)頂點(diǎn)的法線貼圖
- 法線貼圖:針對(duì)像素的法線
5. Animation優(yōu)化
- 更改浮點(diǎn)數(shù)
- 去掉空幀