首页 > 解决方案 > Unity:在我的函数中分配内存的是什么?

问题描述

我对内存和优化比较陌生。我的任务是优化现有项目,在查看 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 只是 GameObjects 的列表。我的 282B 分配可能是什么原因?

标签: c#arraysstringunity3dmemory

解决方案


canvasList变量是一个ListofGameObject并且 Unity 的GameObject派生自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;
}

推荐阅读