想象一下使用 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_EXPLICIT
Font inupdate()
明确调用System.gc()
. 删除这条线,我们回到了绿线下方的轨道上,是的!60 帧/秒。
然而,AndEngine 的作者可能有这个明确调用的原因。由于阶段很短,我们允许我们的应用gc()
在暂停、退出或阶段完成时调用它GameScene
,任何没有过多动画的地方。
预先准备字符并不能缓解打嗝,因为文本是动态的,我们无法准备所有可能的字符来保留System.gc()
这种方法,但以后会尊重它。
实际上,预先准备信件不会触发GC_EXPLICIT
,正如 OP 提供的答案中所描述的那样。
编辑:
经过一番研究,导致 < 60fps 的另一件事是SoundPool
,我们应该用音量0f,0f
和循环播放声音,以防止SoundPool
重置为空闲状态并再次重新启动。