我对内存和优化比较陌生。我的任务是优化现有项目,在查看 Unity 中的探查器时,我看到有一个函数会生成一堆东西供 GC 清理。
函数是这样的:
public bool AnyCanvasOpen()
{
for (int i = 0; i < canvasList.Count; i++)
if (canvasList[i].activeSelf && canvasList[i].name != "MainUICanvas")
return true;
return false;
}
其中 canvasList 只是一个游戏对象列表。我的 282B 分配可能是什么原因?
最佳答案
canvasList
变量是GameObject
的List
,Unity 的GameObject
派生自UnityEngine.Object
。其中有 name
您正在使用的属性(property)。
内存分配来自于:canvasList[i].name != "MainUICanvas"
这是因为 Object.name
属性需要从 native 端返回一个字符串,这意味着每次访问该属性时都会创建一个新字符串。这就是为什么 GameObject.CompareTag
添加了功能,以便可以在不分配内存的情况下比较对象名称。 GameObject.CompareTag
函数将在 native 端比较对象名称,而无需在 C# 端创建或返回新字符串。这将删除内存分配。
不幸的是,他们网站和其他地方的大多数 Unity 代码示例使用 Object.name
而不是 GameObject.CompareTag
函数,这导致更多人使用 Object .name
属性更频繁。
这不应该分配内存:
List<GameObject> canvasList = new List<GameObject>();
public bool AnyCanvasOpen()
{
for (int i = 0; i < canvasList.Count; i++)
if (canvasList[i].activeSelf && canvasList[i].CompareTag("MainUICanvas"))
return true;
return false;
}
关于c# - 统一: What's allocating memory in my function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52323683/