Unity優化是一個很大的概念,我們優化時需要注意三個方面:CPU優化,GPU優化,內存優化。
CPU方面的優化:
(1) 減少DrawCall.
(2) 物理組件(Physics)。
(3) 減少GC(垃圾回收)次數。
(4) 腳本的代碼質量。
一、對DrawCall的優化
1、什么是DrawCall ?
答:Draw Call就是CPU調用圖形編程接口,比如DirectX或OpenGL,來命令GPU進行渲染的操作。
2、 如何減少DrawCall ?
答: 思路就是每個物體盡量減少渲染次數,多個物體最好一起渲染。所以有三個方案:
(1)使用批處理,Unity在運行時將物體合并一次渲染。這里分為動態批處理和靜態批處理。
(2)通過把文理打包成圖集盡量減少材質的使用。
(3)盡量減少反光,陰影之類的效果,因為那會使物體多次渲染。
靜態批處理就是將沒有生命的不同物體設置為Static。
動態批處理是引擎自動進行的,例如動態實例化Prefab(預制體)如果動態物體共享相同的材質,引擎會自動批處理。動態批處理有很大限制,網格物體頂點數不能超過900。
二、對物理組件的優化
1、設置一個合適的FixedTimestep。
2、盡量不要使用網格碰撞器,占用CPU計算。
三、處理GC的優化
雖然GC是用來處理內存的,但是的確會增加對CPU的開銷,因此對于GC的優化目標就是盡量減少GC的觸發。
GC是何時觸發的?
1、堆的內存不足時,自動調用GC。
2、編程人員手動調用GC。
GC的優化說白了就是代碼的優化,主要注意一下5點:
(1)字符串連接的處理。。
(3)不要直接訪問gameObject的tag屬性。換成“if(obj.CompareTag(”Player“))”
(4)使用對象池,以實現空間的重復利用。
(5)不要使用LinQ。
四、對代碼質量的優化
(1)Transfrom組件獲取一次就保留引用,而不是每次都獲取。
(2)不用頻繁的GetComponent
(3)使用內建數組,如Vector3.zero而不是new Vector(0,0,0)。
(4)對方法的參數優化,善于使用ref關鍵字。
GPU方面的優化:
GPU瓶頸:
(1)填充率,可以簡單理解為圖形處理單元每秒渲染的像素數量
(2)像素的復雜度,比如動態陰影、光照、復雜的shader等
(3)幾何體的復雜度(頂點數量)
(4)GPU的顯存帶寬
影響GPU性能的無非就兩大方面,一方面頂點數量過多,像素計算過于復雜;另一方面就是GPU的顯存帶寬。
優化方法:
① 減少頂點數量,簡化計算復雜度。
② 壓縮圖片,以適應顯存帶寬。
一、減少頂點數量,簡化計算復雜度
(1)保持材質的數目盡可能少,更容易批處理。
(2)使用紋理圖集,代替小貼圖。
(3)如果使用了紋理圖集和共享材質,使用Renderer.sharedMaterial來代替Renderer.material。
(4)使用光照貼圖(lightmap)而非實時燈光。
(5)使用LOD(多層次細節),好處就是那些離得遠看不清的細節可以忽略。
(6)遮擋剔除
(7)使用mobile版的shader,因為簡單。
二、壓縮圖片,減小顯存帶寬壓力
(1)OpenGL ES2.0使用ETC1格式壓縮等,在打包設置里有。
(2)使用MipMap,小圖集
內存方面的優化:
(1)Unity3D的內部內存
(2)Mono的托管內存
(3)若干自己引入或第三方DLL所需的內存(非重點)
-
cpu
+關注
關注
68文章
10878瀏覽量
212167 -
gpu
+關注
關注
28文章
4752瀏覽量
129057 -
Unity
+關注
關注
1文章
127瀏覽量
21837
發布評論請先 登錄
相關推薦
評論