我正在开发Android的大炮游戏,需要程序生成关卡。当玩家在空中飞行时,新的部分会被添加到关卡的末尾以使其无限期地继续运行。随着这些部分的添加,播放器已经传递的部分将被删除。问题是创建一个部分通常会导致GC_FOR_ALLOC,它会暂停游戏约30ms并导致明显的延迟。
可用内存保持相当一致,因为删除对象而添加其他对象,因此似乎没有内存泄漏。 我使用的引擎是来自iOS的cocos2D-android-1端口。
我看到许多解决方案都是在游戏运行时不进行初始化的事情,但是级别生成的性质需要这样,因为无限长级别可以' ; t在游戏开始时创建。
感谢您的帮助!
答案 0 :(得分:3)
你不是很具体。如果滞后太大,你必须尝试减少它。
一种方法可能是更频繁地收集 - 导致更短但更经常发生的暂停。
例如,您可能会创建较小或仅部分的部分,然后尝试轻推垃圾收集器以运行。您可以使用System.gc()
。但请注意,System.gc()
不能保证导致它实际开始运行。
更好的解决方案是重用对象。在级别启动之前创建的对象。这种方式即使是无穷无尽的级别也不会导致任何垃圾收集,因为没有垃圾累积。但一定不要创建任何非池化对象!