Unity3D:优化垃圾收集

Zen*_* Qu 12 optimization garbage-collection memory-management unity-game-engine

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

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

if (Time.frameCount % 30 == 0)
{
    System.GC.Collect();
}
Run Code Online (Sandbox Code Playgroud)

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

PS:

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

我在循环或数组中没有字符串连接作为返回值,如帖子中所述.

探查

Hei*_*bug 13

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

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

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

可能这可能是问题所在.

一些提示:

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