Unity3D Profiler给了我主要关于垃圾收集的峰值。在下面的截图中,三个红色尖峰代表我在游戏中的三个档位。每个档位都是100 + ms,大部分时间都花在了TrackDependencies
上。
根据Unity instruction,我尝试将其添加到我的代码中:
if (Time.frameCount % 30 == 0)
{
System.GC.Collect();
}
这没有帮助。我仍然有尖峰,他们仍然需要100 + ms。到底发生了什么,我该怎么做才能优化我的游戏?
PS:
我在游戏中动态创建并摧毁了很多GameObject
个。这可能是个问题吗?
我在循环或数组中没有字符串连接作为the post中隐含的返回值。
答案 0 :(得分:13)
这没有帮助。我仍然有尖峰,他们仍然需要100 + ms。什么 到底是怎么回事?我该怎么做才能优化我的游戏?
使用System.GC.Collect
,您只需强制进行垃圾回收。如果你已经从最后一次收集中分配了大量内存,那么你就无法避免尖峰。这仅用于尝试随时间分发垃圾收集,避免大量释放。
我在我的动态创建和销毁很多GameObjects 游戏。这可能是个问题吗?
可能这可能是问题所在。
一些提示:
LoadResource
和Instantiate
)资源。如果所需的内存不是太多,您可以简单地实例化所需的所有资源,并根据需要禁用/启用它们。如果资源内存需求很大,则无法实现。Instantiate
和Destroy
打电话。创建对象池,其中一组资源在应用程序启动时实例化。启用所需的资源,并禁用所有其他资源。而不是销毁对象将其释放到池中,以便可以根据需要禁用和重新安装。Resources.UnloadUnusedAssets
。如果您以前发布了新资源,这只会增加实例化新资源所需的时间。优化内存使用是有用的,但是以每个时间间隔或每次销毁对象时调用它是没有意义的。