Unity3D:优化垃圾收集

时间:2013-07-05 05:46:43

标签: optimization memory-management garbage-collection unity3d

Unity3D Profiler给了我主要关于垃圾收集的峰值。在下面的截图中,三个红色尖峰代表我在游戏中的三个档位。每个档位都是100 + ms,大部分时间都花在了TrackDependencies上。

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

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

这没有帮助。我仍然有尖峰,他们仍然需要100 + ms。到底发生了什么,我该怎么做才能优化我的游戏?

PS:

我在游戏中动态创建并摧毁了很多GameObject个。这可能是个问题吗?

我在循环或数组中没有字符串连接作为the post中隐含的返回值。

profiler

1 个答案:

答案 0 :(得分:13)

  

这没有帮助。我仍然有尖峰,他们仍然需要100 + ms。什么   到底是怎么回事?我该怎么做才能优化我的游戏?

使用System.GC.Collect,您只需强制进行垃圾回收。如果你已经从最后一次收集中分配了大量内存,那么你就无法避免尖峰。这仅用于尝试随时间分发垃圾收集,避免大量释放。

  

我在我的动态创建和销毁很多GameObjects   游戏。这可能是个问题吗?

可能这可能是问题所在。

一些提示:

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