gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:16:16 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com