使用TryGetComponent取代GetComponent以避免Editor中的記憶體分配
- 2019 年 10 月 18 日
- 筆記
作為Unity開發人員,可能或多或少都會遇到過一個常見的Unity的GC分配問題——在Editor中使用GetComponent方法來獲取一個不存在的Component時會分配額外的記憶體。就像下圖


需要注意的是,這個記憶體分配只會發生在Editor中。更多相關內容可以查看這篇文章:
https://zhuanlan.zhihu.com/p/26763624
但是這裡的記憶體分配是如何產生的呢?
這是因為當MonoBehaviour具有欄位時,在Editor中Unity不會將這些欄位設置為真正的“null”,而是設置為表示“null”的偽空對象。如果所請求的Component不存在,則Unity將在新分配的偽空對象內生成一個自定義警告字元串。有關資訊,大家可以查看此部落格。
https://blogs.unity3d.com/2014/05/16/custom-operator-should-we-keep-it/
不過好消息是,自Unity 2019.2起,Unity添加了可以處理這種情況的新API ——TryGetComponent API。
https://unity.cn/releases/full/2019/2019.2.0
與GameObject.GetComponent相比,一個最大的區別是,當請求的Component不存在時,此方法不會在編輯器中分配記憶體。下面的螢幕截圖是使用TryGetComponent測試的結果。

Useful Link:
https://docs.microsoft.com/zh-cn/learn/?WT.mc_id=DT-MVP-5001664
