ScrollRect.LateUpdate() 在分析器中分配 GC 高达 2.4MB 的峰值

Uma*_*r M 3 optimization performance profiling garbage-collection unity-game-engine

跟进我之前关于 Profiler 峰值的问题。我刚刚发现,如果我在 Unity3D 中启用深度配置文件选项,我可以看到GetComponent()调用 underScrollRect.LateUpdate()仅占用 2.4 MB 内存用于仅 5 个Scroll Rect组件的垃圾收集。从以下快照中可以明显看出,UnityComponent.GetComponent()LateUpdate()导致性能问题的方法中调用了 4046 次。我的应用程序是 UI 密集型的,但是 GC 的 2.4MB 根本不可接受。

在此处输入图片说明

通常建议不要GetComponent()在任何更新方法中使用,但 Unity 自己的实现违反了约定。这限制了我在一个场景中可以拥有的 UI 项的数量,以避免性能问题。

请注意,当我激活菜单对象时,此分析数据仅来自框架。

是否有任何解决方法可以减少/节省 2.4MB 的内存?

Pro*_*mer 5

通常建议不要在任何更新方法中使用 GetComponent() 但 Unity 自己的实现违反了约定

Unity的GetComponent()没有应用它是建立在分配内存。构建应用程序以验证这一点。它在编辑器中分配内存。

几年前,Unity 发表了一篇关于此的帖子

我们仅在编辑器中执行此操作。这就是为什么当您调用 GetComponent() 来查询不存在的组件时,您会看到 C# 内存分配发生的原因,因为我们正在新分配的假空对象中生成此自定义警告字符串。这种内存分配不会发生在内置游戏中。这是一个很好的例子,为什么如果你要分析你的游戏,你应该总是分析实际的独立播放器或移动播放器,而不是分析编辑器,因为我们在编辑器中做了很多额外的安全/安全/使用检查以牺牲一些性能为代价,您的生活更轻松。在分析性能和内存分配时,永远不要分析编辑器,始终分析构建的游戏。

建议配置真实游戏而不是编辑器中的游戏。