天天看點

Unity3d性能優化總結

Unity3D 性能 優化

一、程式方面

01、務必删除腳本中為空或不需要的預設方法;

02、隻在一個腳本中使用OnGUI方法;

03、避免在OnGUI中對變量、方法進行更新、指派,輸出變量建議在Update内;

04、同一腳本中頻繁使用的變量建議聲明其為全局變量,腳本之間頻繁調用的變量或方法建議聲明為全局靜态變量或方法;

05、不要去頻繁擷取元件,将其聲明為全局變量;

06、數組、集合類元素優先使用Array,其次是List;

07、腳本在不使用時腳本禁用之,需要時再啟用;

08、可以使用Ray來代替OnMouseXXX類方法;

09、需要隐藏/顯示或執行個體化來回切換的對象,盡量不要使用SetActiveRecursively或active,而使用将對象遠遠移出相機範圍和移回原位的做法;

10、盡量少用模運算和除法運算,比如a/5f,一定要寫成a*0.2f。

11、對于不經常調用或更改的變量或方法建議使用Coroutines & Yield;

12、盡量直接聲明腳本變量,而不使用GetComponent來擷取腳本;

iPhone

13、盡量使用整數數字,因為iPhone的浮點數計算能力很差;

14、不要使用原生的GUI方法;

15、不要執行個體化(Instantiate)對象,事先建好對象池,并使用Translate“生成”對象;

二、模型方面

01、合并使用同貼圖的材質球,合并使用相同材質球的Mesh;

02、角色的貼圖和材質球隻要一個,若必須多個則将模型離分離為多個部分;

02、骨骼系統不要使用太多;

03、當使用多角色時,将動畫單獨分離出來;

04、使用層距離來控制模型的顯示距離;

05、陰影其實包含兩方面陰暗和影子,建議使用實時影子時把陰暗效果烘焙出來,不要使用燈光來調節光線陰暗。

06、少用像素燈和使用像素燈的Shader;

08、如果硬陰影可以解決問題就不要用軟陰影,并且使用不影響效果的低分辨率陰影;

08、實時陰影很耗性能,盡量減小産生陰影的距離;

09、允許的話在大場景中使用線性霧,這樣可以使遠距離對象或陰影不易察覺,是以可以通過減小相機和陰影距離來提高性能;

10、使用圓滑組來盡量減少模型的面數;

11、項目中如果沒有燈光或對象在移動那麼就不要使用實時燈光;

12、水面、鏡子等實時反射/折射的效果單獨放在Water圖層中,并且根據其實時反射/折射的範圍來調整;

13、碰撞對效率的影響很小,但碰撞還是建議使用Box、Sphere碰撞體;

14、建材質球時盡量考慮使用Substance;

15、盡量将所有的實時反射/折射(如水面、鏡子、地闆等等)都集合成一個面;

16、假反射/折射沒有必要使用過大分辨率,一般64*64就可以,不建議超過256*256;

17、需要更改的材質球,建議執行個體化一個,而不是使用公共的材質球;

18、将不須射線或碰撞事件的對象置于IgnoreRaycast圖層;

19、将水面或類似效果置于Water圖層

20、将透明通道的對象置于TransparentFX圖層;

21、養成良好的标簽(Tags)、層次(Hieratchy)和圖層(Layer)的條理化習慣,将不同的對象置于不同的标簽或圖層,三者有效的結合将很友善的按名稱、類别和屬性來查找;

22、通過Stats和Profile檢視對效率影響最大的方面或對象,或者使用禁用部分模型的方式檢視問題到底在哪兒;

23、使用遮擋剔除(Occlusion Culling)處理大場景,一種較原生的類LOD技術,并且能夠“分割”作為整體的一個模型。

三、其它

場景中如果沒有使用燈光和像素燈,就不要使用法線貼圖,因為法線效果隻有在有光源(Direct Light/Point Light/Angle Light/Pixel Light)的情況下才有效果。

繼續閱讀