想象一下使用 Text() 实体制作的分数计数器。简单的。
在我开始游戏后,调用setText()会导致启动GC_EXPLICIT会减慢游戏速度导致冻结,并且在几次调用后 - 问题消失了。首先,我认为这是 Java 中字符串和连接的问题,所以我使用了 StringBuilder。问题依然存在。如果我更改setText("$" + score + "M")为简单,setText("0")则不会注意到打嗝!
想象一下使用 Text() 实体制作的分数计数器。简单的。
在我开始游戏后,调用setText()会导致启动GC_EXPLICIT会减慢游戏速度导致冻结,并且在几次调用后 - 问题消失了。首先,我认为这是 Java 中字符串和连接的问题,所以我使用了 StringBuilder。问题依然存在。如果我更改setText("$" + score + "M")为简单,setText("0")则不会注意到打嗝!
问题出在Font. 的创建Texture实际上并没有将字符加载到这个Texture!您需要做的就是在创建Font简单的调用之后:
pFont.prepareLetters("0123456789".toCharArray());
包含您需要的所有字符。
由于GC_EXPLICITFont inupdate()明确调用System.gc(). 删除这条线,我们回到了绿线下方的轨道上,是的!60 帧/秒。
然而,AndEngine 的作者可能有这个明确调用的原因。由于阶段很短,我们允许我们的应用gc()在暂停、退出或阶段完成时调用它GameScene,任何没有过多动画的地方。
预先准备字符并不能缓解打嗝,因为文本是动态的,我们无法准备所有可能的字符来保留System.gc()这种方法,但以后会尊重它。
实际上,预先准备信件不会触发GC_EXPLICIT,正如 OP 提供的答案中所描述的那样。
编辑:
经过一番研究,导致 < 60fps 的另一件事是SoundPool,我们应该用音量0f,0f和循环播放声音,以防止SoundPool重置为空闲状态并再次重新启动。