c# - 统一: What's allocating memory in my function?

标签 c# arrays string unity3d memory

我对内存和优化比较陌生。我的任务是优化现有项目,在查看 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 变量是GameObjectList,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/

相关文章:

c# - 使用任何或所有分隔符之一按单词拆分字符串?

c# - 如何在下拉列表中默认显示当前日期?

python - 如何使用 f2py 将字符串数组传递给 Fortran 子例程

c# - 如何在 C# 中运行多个任务?

javascript - 数组数组包含数组javascript

c - 如何对随机数进行排序

java - 使用 selenium web 驱动程序可以在单个单元格中打印多个值

c - 执行 fgets/fputs 时最后一行重复

c# - 使 PCL Xamarin (MonoDroid/MonoTouch) 兼容的问题

c# - 如何查找方法是否正在实现特定接口(interface)