c# - 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 分配可能是什么原因?
解决方案
该canvasList
变量是一个List
ofGameObject
并且 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;
}
推荐阅读
- html - 从未选中的选项卡保存到 PDF 页面,保持其 CSS 样式
- javascript - 将 for 循环转换为 forEach
- gremlin - 如何在gremlin中使用少于CHOOSE步骤的内部选项
- django - 我的 rest api 视图总是创建一个新对象而不是 put , delete 和 patch
- ethereum - 如何使用 Ganache-cli 在 Solidity 中获取 EIP-198
- rasa-nlu - 如何动态地向 Rasa NLU 添加新的训练短语?
- javascript - 如何在 .ajax() 之外使用 ajaxSuccess()
- python - ValueError:请求网址中缺少方案
- typescript - 为什么在解构响应对象后会引发“无法在 'Response' 上执行 'json'”错误
- java - RoomDatabase 中有一些硬编码的值,卸载后不会消失