天天看點

Unity 減少垃圾收集 (GC) 的影響

Unity 使用 Boehm-Demers-Weiser 垃圾收集器,它會停止運作程式代碼,并且僅在其完成所有工作後才恢複正常執行。

要注意某些不必要的堆配置設定,這可能會導緻 GC 尖峰 :

1.字元串 :

在 C# 中,字元串是引用類型,而不是值類型。減少不必要的字元串建立或操作。避免解析基于字元串的資料檔案,例如 JSON 和 XML ;改用 ScriptableObject 或 MessagePack、Protobuf 等格式存儲資料。如果需要在運作時建構字元串,請使用 StringBuilder 類。

2.Unity 函數調用 :

請注意,某些函數會建立堆配置設定。緩存數組引用,不要在循環中配置設定數組。此外,請使用某些避免産生垃圾的函數 ;例如,使用 GameObject.CompareTag 而不是手動将字元串與 GameObject.tag 進行比較

(傳回新字元串會産生垃圾)。

3.裝箱 :

避免傳遞值類型變量來代替引用類型變量。這會建立臨時對象,以及随之而來的潛在垃圾,例如,int i = 123; object o = i 會将值類型隐式轉換為類型對象。

4.協程 :

雖然 yield 不會産生垃圾,但建立新的 WaitForSeconds 對象會。緩存并重用 WaitForSeconds 對象,而不要在 yield 行中建立它。

5.LINQ 和正規表達式 :

它們幕後都會進行裝箱,進而産生垃圾。如果性能很重要,請避免使用 LINQ 和正規表達式。如有可能,定時收集垃圾

如果确定垃圾收集當機不會影響遊戲中的某個特定點,則可以使用 System.GC.Collect

觸發垃圾收集。

有關在哪些地方可以通過這樣做而受益的示例,請參閱了解自動記憶體管理。

使用增量式垃圾收集器拆分GC 工作負載

增量式垃圾收集使用多個短得多的程式執行中斷,而不是單次長時間的中斷,将工作負載分布到多個幀上。如果垃圾收集影響了性能,可以嘗試啟用該選項,看看它能否顯著減少 GC 尖峰問題。使用 Profile Analyzer 驗證對應用程式的改善。