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

时间:2016-08-17 16:56:40

标签: performance optimization unity3d garbage-collection profiling

跟踪有关Profiler峰值的my previous question。我刚刚想到如果我在Unity3D中启用深层配置文件选项,我可以看到GetComponent()下的ScrollRect.LateUpdate()调用最多需要2.4 MB内存,用于仅5个Scroll Rect组件的垃圾回收。从以下快照可以明显看出,Unity在Component.GetComponent()方法中调用LateUpdate() 4046次会导致性能问题。我的应用程序是UI密集型,但GC的2.4MB是完全不可接受的。

enter image description here

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

请注意,此分析数据仅来自激活菜单对象时的帧。

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

1 个答案:

答案 0 :(得分:4)

  

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

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

Unity几年前就提出了post

  

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

建议分析真实游戏,而不是编辑器中的游戏。