Unity3D 性能優(yōu)化
一、程序方面
01、務(wù)必刪除腳本中為空或不需要的默認(rèn)方法;
02、只在一個(gè)腳本中使用OnGUI方法;
03、避免在OnGUI中對變量、方法進(jìn)行更新、賦值,輸出變量建議在Update內(nèi);
04、同一腳本中頻繁使用的變量建議聲明其為全局變量,腳本之間頻繁調(diào)用的變量或方法建議聲明為全局靜態(tài)變量或方法;
05、不要去頻繁獲取組件,將其聲明為全局變量;
06、數(shù)組、集合類元素優(yōu)先使用Array,其次是List;
07、腳本在不使用時(shí)腳本禁用之,需要時(shí)再啟用;
08、可以使用Ray來代替OnMouseXXX類方法;
09、需要隱藏/顯示或?qū)嵗瘉砘厍袚Q的對象,盡量不要使用SetActiveRecursively或active,而使用將對象遠(yuǎn)遠(yuǎn)移出相機(jī)范圍和移回原位的做法;
10、盡量少用模運(yùn)算和除法運(yùn)算,比如a/5f,一定要寫成a*0.2f。
11、對于不經(jīng)常調(diào)用或更改的變量或方法建議使用Coroutines & Yield;
12、盡量直接聲明腳本變量,而不使用GetComponent來獲取腳本;
iPhone
13、盡量使用整數(shù)數(shù)字,因?yàn)閕Phone的浮點(diǎn)數(shù)計(jì)算能力很差;
14、不要使用原生的GUI方法;
15、不要實(shí)例化(Instantiate)對象,事先建好對象池,并使用Translate“生成”對象;
二、模型方面
01、合并使用同貼圖的材質(zhì)球,合并使用相同材質(zhì)球的Mesh;
02、角色的貼圖和材質(zhì)球只要一個(gè),若必須多個(gè)則將模型離分離為多個(gè)部分;
02、骨骼系統(tǒng)不要使用太多;
03、當(dāng)使用多角色時(shí),將動(dòng)畫單獨(dú)分離出來;
04、使用層距離來控制模型的顯示距離;
05、陰影其實(shí)包含兩方面陰暗和影子,建議使用實(shí)時(shí)影子時(shí)把陰暗效果烘焙出來,不要使用燈光來調(diào)節(jié)光線陰暗。
06、少用像素?zé)艉褪褂孟袼責(zé)舻腟hader;
08、如果硬陰影可以解決問題就不要用軟陰影,并且使用不影響效果的低分辨率陰影;
08、實(shí)時(shí)陰影很耗性能,盡量減小產(chǎn)生陰影的距離;
09、允許的話在大場景中使用線性霧,這樣可以使遠(yuǎn)距離對象或陰影不易察覺,因此可以通過減小相機(jī)和陰影距離來提高性能;
10、使用圓滑組來盡量減少模型的面數(shù);
11、項(xiàng)目中如果沒有燈光或?qū)ο笤谝苿?dòng)那么就不要使用實(shí)時(shí)燈光;
12、水面、鏡子等實(shí)時(shí)反射/折射的效果單獨(dú)放在Water圖層中,并且根據(jù)其實(shí)時(shí)反射/折射的范圍來調(diào)整;
13、碰撞對效率的影響很小,但碰撞還是建議使用Box、Sphere碰撞體;
14、建材質(zhì)球時(shí)盡量考慮使用Substance;
15、盡量將所有的實(shí)時(shí)反射/折射(如水面、鏡子、地板等等)都集合成一個(gè)面;
16、假反射/折射沒有必要使用過大分辨率,一般64*64就可以,不建議超過256*256;
17、需要更改的材質(zhì)球,建議實(shí)例化一個(gè),而不是使用公共的材質(zhì)球;
18、將不須射線或碰撞事件的對象置于IgnoreRaycast圖層;
19、將水面或類似效果置于Water圖層
20、將透明通道的對象置于TransparentFX圖層;
21、養(yǎng)成良好的標(biāo)簽(Tags)、層次(Hieratchy)和圖層(Layer)的條理化習(xí)慣,將不同的對象置于不同的標(biāo)簽或圖層,三者有效的結(jié)合將很方便的按名稱、類別和屬性來查找;
22、通過Stats和Profile查看對效率影響最大的方面或?qū)ο?,或者使用禁用部分模型的方式查看問題到底在哪兒;
23、使用遮擋剔除(Occlusion Culling)處理大場景,一種較原生的類LOD技術(shù),并且能夠“分割”作為整體的一個(gè)模型。
三、其它
場景中如果沒有使用燈光和像素?zé)?,就不要使用法線貼圖,因?yàn)榉ň€效果只有在有光源(Direct Light/Point Light/Angle Light/Pixel Light)的情況下才有效果。