Ryo*_*olu 2 c# memory arrays string unity-game-engine
我对内存和优化比较陌生。我的任务是优化一个现有项目,在查看 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;
}
Run Code Online (Sandbox Code Playgroud)
其中 canvasList 只是游戏对象的列表。我的 282B 分配可能是什么原因?
该canvasList变量是一个ListofGameObject并且 UnityGameObject派生自该变量,其中UnityEngine.Object包含name您正在使用的属性。
内存分配来自:canvasList[i].name != "MainUICanvas"
这是因为该Object.name属性需要从本机端返回一个字符串,这意味着每次访问该属性时都会创建一个新字符串。这就是GameObject.CompareTag添加该函数的原因,以便可以在不分配内存的情况下比较对象名称。该GameObject.CompareTag函数将比较本机端的对象名称,而无需在 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;
}
Run Code Online (Sandbox Code Playgroud)