Unity:什么在我的函数中分配内存?

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 分配可能是什么原因?

Pro*_*mer 6

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)