2012-01-06 42 views
1

我正在做一个快节奏的实时 Android游戏,并且一切都很好,但游戏开始时的头几秒很滞后,因为垃圾收集器在加载线程后清理。当然,玩家可以等待几秒钟(比如10+秒),因为玩完后它开始运行非常流畅,但看起来真的很难看,并且感觉游戏很麻烦。在开始使用Java之前等待GC完成?

有没有一种方法(或技术)来告诉它何时启动游戏的安全,以便垃圾收集器在实时部分一开始就不会开始疯狂?没有破坏的东西,大的加载线程不能被减少很多。

+1

“非常滞后,因为垃圾收集器在加载线程后清理。” - 这并不是说你在加载过程中搅动了内存,还是仅仅是加载时间?如果前者,你能避免的是什么? – 2012-01-06 00:28:58

+0

@Mitch:它表明加载器使用了很多对象(或者一些大对象)。直到初始化完成,可能都不符合收集条件。 – cHao 2012-01-06 00:33:30

+0

@cHao:我很好奇为什么装载机需要很多对象? – 2012-01-06 00:37:14

回答

3

这似乎是System.gc()可能有所帮助的情况。它告诉系统,这将是收集垃圾的好时机。根据文档,

当控制从方法调用返回时,Java虚拟机已尽最大努力从所有被丢弃的对象中回收空间。

该文档还表示,虽然该方法“建议”的对象被收集 - 那就是,谁也不能保证它会帮助,特别是如果你仍然有一些参考squirreled了。如果确实有效,它只会收集运行代码中根本无法访问的对象,包括运行时。 (例如,该加载程序线程不符合收集直到它已完成运行您的代码没有更多的引用它。)

1

您可以(至少根据从该方法返回之前官方的JavaDoc here,光洁度和),你开始游戏手动强制垃圾收集器运行的权利之前运行System.gc()。然而,总的来说,GC是不确定的,不能保证它不会再次运行,或者对于这个问题,System.gc()的呼叫什么都不会做。

+1

真的,但[这个问题](http://stackoverflow.com/questions/3117429/garbage-collector-in-android)似乎表明System.gc()确实在android上做了一些事情,我认为这是一个非常合法的案例来运行GC。它当然不会受伤。 – 2012-01-06 00:26:13

1

如果您深入研究了这一点,您可能会发现很多(甚至大多数)“迟钝”不是GC的错。我怀疑这主要是由于JIT编译。调用System.gc()可以改善事情,但我怀疑它会完全消除这种延迟。

+0

我不认为这就是问题,因为当发生LAGG,我的日志显示一堆线即说:“GC_CONCURRENT ......等等等等等等......”而那些停止展示了LAGG消失后:\编辑:另外,我只是在开始游戏后才开始注意到lagg变得越来越复杂,我不得不越来越多地加载加载函数。它一开始并没有落后这么多 – AlexRamallo 2012-01-06 04:15:35

相关问题