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)的情況下才有效果。

2.1渲染

1.不使用或少使用動態光照,使用light mapping和light probes(光照探頭)

2.不使用法線貼圖(或者只在主角身上使用),靜態物體盡量將法線渲染到貼圖

3.不適用稠密的粒子,盡量使用UV動畫

4.不使用fog,使用漸變的面片(參考shadow gun)

5.不要使用alpha –test(如那些cutout shader),使用alpha-blend代替

6.使用盡量少的material,使用盡量少的pass和render次數,如反射、陰影這些操作

7.如有必要,使用Per-Layer Cull Distances,Camera.layerCullDistances

8.只使用mobile組里面的那些預置shader

9.使用occlusion culling

11.遠處的物體繪制在skybox上

12.使用drawcall batching: 對於相鄰動態物體:如果使用相同的shader,將texture合並 對於靜態物體,batching要求很高,詳見Unity Manual>Advanced>Optimizing Graphics Performance>Draw Call Batching 規格上限

1. 每個模型只使用一個skinned mesh renderer

2. 每個mesh不要超過3個material

3. 骨骼數量不要超過30

4. 面數在1500以內將得到好的效率

2.2物理

1.真實的物理(剛體)很消耗,不要輕易使用,盡量使用自己的代碼模仿假的物理

2.對於投射物不要使用真實物理的碰撞和剛體,用自己的代碼處理

3.不要使用mesh collider

4.在edit->project setting->time中調大FixedTimestep(真實物理的幀率)來減少cpu損耗

2.3腳本編寫

1.盡量不要動態的instantiate和destroy object,使用object pool

2.盡量不要再update函數中做復雜計算,如有需要,可以隔N幀計算一次

3.不要動態的產生字符串,如Debug.Log("boo" + "hoo"),盡量預先創建好這些字符串資源

4.cache一些東西,在update里面盡量避免search,如GameObject.FindWithTag("")、GetComponent這樣的調用,可以在start中預先存起來

5.盡量減少函數調用棧,用x = (x > 0 ? x : -x);代替x = Mathf.Abs(x)

6.String的相加操作,會頻繁申請內存並釋放,導致gc頻繁,使用System.Text.StringBuilder代替

2.4 shader編寫

1.數據類型 fixed / lowp - for colors, lighting information and normals, half / mediump - for texture UV coordinates, float / highp - avoid in pixel shaders, fine to use in vertex shader for position calculations.

2.少使用的函數:pow,sin,cos等

2.4 GUI

1.不要使用內置的onGUii函數處理gui,使用其他方案,如NGUI

3.格式

1.貼圖壓縮格式:ios上盡量使用PVRTC,Android上使用ETC


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM