是否可以等待GC_FOR_ALLOCATION完成?

时间:2016-04-23 17:45:37

标签: java android libgdx garbage-collection

我在我的Libgdx Android游戏中遇到了一些问题。当我更改屏幕时,动画会在创建新屏幕后立即启动。它在桌面上运行得非常精细和平滑,但是当我在Android设备上运行时,在创建新屏幕时会出现延迟,看起来只是跳过几帧动画。

经过一番调查后,我发现这是因为创建新屏幕会调用许多新图像和其他要创建的对象,因此GC_FOR_ALLOC被多次调用:

04-23 20:26:11.411: D/dalvikvm(18461): GC_FOR_ALLOC freed 385K, 48% free 8809K/16880K, paused 12ms, total 12ms
04-23 20:26:11.531: D/dalvikvm(18461): GC_FOR_ALLOC freed 454K, 48% free 8867K/16880K, paused 12ms, total 12ms
04-23 20:26:11.651: D/dalvikvm(18461): GC_FOR_ALLOC freed 475K, 48% free 8903K/16880K, paused 13ms, total 13ms
04-23 20:26:11.746: D/dalvikvm(18461): GC_FOR_ALLOC freed 473K, 48% free 8942K/16880K, paused 12ms, total 13ms
04-23 20:26:11.856: D/dalvikvm(18461): GC_FOR_ALLOC freed 481K, 47% free 8967K/16880K, paused 12ms, total 12ms

所以我的问题是: 我可以以某种方式让我的应用程序等待这些操作完成,并且只有在启动动画之后才能完成吗?

事实上,我需要有能力让垃圾收集者“state”状态。或者某种东西,这样我就可以在 gc完成分配操作后启动动画

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我不了解Libgdx,但我发现它有一个Gdx.graphics.getFramesPerSecond()方法,所以也许你只有在FPS稳定时才能开始动画。 如果该方法花费的时间太长而无法给出合适的平均值,那么您可以从getRawDeltaTime()开始测量自己的FPS。

答案 1 :(得分:0)

使用System.gc()。文档:

  

当控制从方法调用返回时,Java虚拟机   我们尽最大努力从所有废弃物体中回收空间。

请参阅Waiting for GC to finish before starting game with Java?