【问题标题】:Unity3D: optimize garbage collectionUnity3D:优化垃圾收集
【发布时间】:2013-07-05 05:46:42
【问题描述】:

Unity3D Profiler 给了我一些主要是关于垃圾收集的尖峰。在下面的屏幕截图中,三个红色尖峰代表我在游戏中的三个档位。这些停顿中的每一个都是 100 多毫秒,大部分时间都花在了TrackDependencies 上。

根据Unity instruction,我尝试将其添加到我的代码中:

if (Time.frameCount % 30 == 0)
{
    System.GC.Collect();
}

这没有帮助。我仍然有尖峰,它们仍然需要 100 多毫秒。究竟发生了什么?我可以做些什么来优化我的游戏?

PS:

我在我的游戏中动态地创建和销毁很多GameObjects。会不会有问题?

我没有在循环或数组中将字符串连接作为返回值,正如 the post 中所警告的那样。

【问题讨论】:

  • 您是否在代码中的某处破坏了对象?
  • 如果可能,将对象池化以避免过度破坏可能是一个很好的解决方案。
  • @Heisenbug 是的,我在我的游戏中动态地创建和销毁许多对象。在我的销毁对象函数中,我还调用了Resources.UnloadUnusedAssets();

标签: optimization memory-management garbage-collection unity3d


【解决方案1】:

这没有帮助。我仍然有尖峰,它们仍然需要 100 多毫秒。什么 到底发生了什么,我可以做些什么来优化我的游戏?

使用System.GC.Collect,您只是强制进行垃圾收集。如果您已分配大量内存以从上次收集中释放,那么您将无法避免尖峰。这仅在尝试随着时间的推移分配垃圾收集以避免大规模释放时才有用。

我正在动态创建和销毁我的许多游戏对象 游戏。会不会有问题?

这可能是问题所在。

一些提示:

  • 在申请开始时尽量分配(LoadResourceInstantiate)资源。如果所需的内存不是太多,您可以简单地实例化您需要的所有资源并按需禁用/启用它们。如果资源内存需求很大,这是无法实现的。
  • 避免在游戏中调用InstantiateDestroy。创建一个对象池,在应用程序启动时实例化一组资源。启用您需要的资源,并禁用所有其他资源。与其销毁对象,不如将其释放到池中,以便可以按需禁用和重新启用它。
  • 避免在游戏中调用Resources.UnloadUnusedAssets。如果您之前发布过新资源,这只会增加实例化新资源所需的时间。优化内存使用很有用,但在恒定间隔或每次销毁对象时调用它是没有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多