13

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

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

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

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

PS:

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

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

剖析器

4

1 回答 1

15

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

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

我在我的游戏中动态地创建和销毁很多游戏对象。这会是个问题吗?

可能这可能是问题所在。

一些提示:

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