作为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