跟踪有关Profiler峰值的my previous question。我刚刚想到如果我在Unity3D中启用深层配置文件选项,我可以看到GetComponent()
下的ScrollRect.LateUpdate()
调用最多需要2.4 MB内存,用于仅5个Scroll Rect
组件的垃圾回收。从以下快照可以明显看出,Unity在Component.GetComponent()
方法中调用LateUpdate()
4046次会导致性能问题。我的应用程序是UI密集型,但GC的2.4MB是完全不可接受的。
通常建议不要在任何更新方法中使用GetComponent()
,但Unity自己的实现正在违反惯例。这限制了我在一个场景中可以拥有的UI项目的数量,以避免性能问题。
请注意,此分析数据仅来自激活菜单对象时的帧。
是否有减少/节省2.4MB内存的解决方法?
答案 0 :(得分:4)
通常建议不要在任何更新中使用GetComponent() 方法,但Unity自己的实现正在违反惯例
Unity GetComponent()
在构建应用程序时不分配内存。构建应用程序以验证这一点。它在编辑器中分配内存 。
Unity几年前就提出了post:
我们只在编辑器中执行此操作。这就是你打电话的原因 GetComponent()用于查询不存在的组件 看到C#内存分配正在发生,因为我们正在生成这个 新分配的假null对象内的自定义警告字符串。 在内置游戏中不会发生这种内存分配。这是非常的 很好的例子为什么如果你正在分析你的游戏,你应该永远 描述实际的独立播放器或移动播放器,而不是个人资料 编辑,因为我们做了很多额外的安全/安全/使用 检查编辑器,让你的生活更轻松,牺牲一些 性能。分析性能和内存分配时, 从不描述编辑器,总是描述构建的游戏。
建议分析真实游戏,而不是编辑器中的游戏。