Unity性能優化的小技巧

1、Draw Call 

2、資源(模型、貼圖、粒子)

3、渲染(相機,光照,Shader)

4、網絡

5、代碼(代碼編寫,資源加載,物理系統)

可以在Profiler窗口查看項目性能消耗主要在那幾個地方,然後有針對性的進行優化

下面給大家分享一些常用的代碼方面的內容

1、在場景中有大量物體頻繁的激活或隱藏時,不適用SetActive(),在需要隱藏的時候移除屏幕,顯示的時候移到屏幕內(也就是修改物體的位置)。還有一個方法,就是把需要隱藏的物體設置爲一個已經隱藏的物體的子物體(父物體是隱藏的,子物體自然也看不到),這種方法和SetActive()方法差不多,不推薦使用。

2、動態實例化到場景中的物體,名字都會有一個後綴(Clone),但是爲了方便識別,會修改它的名字,這樣同樣會產生性能消耗。

3、在不影響正常運行結果的情況下,減少對Update或者FixUpdate的調用次數

假設顯示將所有的Update刷新邏輯寫在RefreshUpdate中

void RefreshUpdate()

{

Debug.Log("RefreshUpdate");

}

3-1每隔一定幀數,執行一次RefreshUpdate();

int SpaceCount=10;

int UpdateCount;

void Update()

{

if(UpdateCount % SpaceCount==0)

{

UpdateCount =0;

}

UpdateCount ++;

}

3-2使用協程While(true)循環,每次循環間隔一定的時間,調用RefreshUpdate(),需要在Satrt函數中開啓協程

float SpaceTime=0.1f;

IEnumerator StartUpdate()

{

While(true)

{

RefreshUpdate();

yield return new WaitForSeconds(SpaceTime);

}

}

3-3 使用InvokeRepeating循環調用RefreshUpdate();

float RepaetTime=0.1f;

void Start()

{

InvokeRepeating("RefreshUpdate",0,RepaetTime);

}

4、使用對象池

操作目標相對較少,可簡化對象池,實現效果。

5、音效播放時,爲避免頻繁創建、銷燬播放器,可以對音效統一管理

6、場景中經常需要動態生成GameObject,當一次創建的數量交多的時候,在不影響使用的情況下,可以使用協程,在多幀內完成創建

7、部分簡單的物理計算可以不適用Unity提供的物理系統,簡化物理計算量

8、選擇合理的數據結構存儲數據

9、儘量避免在Update和for循環內創建臨時變量

10、儘量避免創建臨時字符串

11、能使用for循環的,就不用foreach

12、每個繼承MonoBehaviour的類,都會自動生成Update方法,但是很多類是使用不到Update的,這個時候需要將其刪除,畢竟實時調用孔方法,多少還是有消耗的。

13、數值計算中使用乘法而不用除法,比如:A/2,可以寫成A*0.5F;

14、在比較Tag的時候,使用if(gameObject.CompareTag("Tag")),而不是if(gameObject.tag=="Tag")

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章