我一直在为3-4个设备测试我的游戏,其中一个是低端设备。
游戏冻结几个发送,然后项目出现在屏幕上。首先我认为它是因为是低端设备。但我发现只有一次,在第一次安装时,在S4中,冻结了一秒然后它很顺利。所以我猜问题出现在我的代码中。
我已将所有内容保存在TimerHandler中并在更新处理程序中进行共谋和分数计算,我无法找到问题所在。 TimeHandler和UpdateHandler是否与我们创建的Thread不同?
请找到我的代码片段(无法发布整个代码)
private void collectPointsTimeHandler() {
mEngine.unregisterUpdateHandler(spriteTimerHandler);
spriteTimerHandler = null;
float mEffectSpawnDelay = 1.8f;
normalTimerHandler = new TimerHandler(mEffectSpawnDelay, true,
new ITimerCallback() {
public void onTimePassed(TimerHandler pTimerHandler) {
//seconds calculation
if(seconds % 2 == 0 || seconds % 3 == 0){
addNegativeItems();
getEngine().unregisterUpdateHandler(wellTimerHandler);
}else if(seconds % 5 == 0){
addQuestion();
}
}
});
mEngine.registerUpdateHandler(normalTimerHandler);
}
在onLoadScene();
中调用此函数然后是共谋检查部分
IUpdateHandler pointsHandler = new IUpdateHandler() {
public void reset() {
}
public void onUpdate(float pSecondsElapsed) {
Iterator<AnimatedSprite> targets = targetPoint.iterator();
AnimatedSprite _target = null;
// iterating over the targets
while (targets.hasNext()) {
_target = targets.next();
// if target passed the left edge of the screen, then remove it
// and call a fail]
if (_target.getY() >= cameraHeight) {
// removeSprite(_target, targets);
_target.setVisible(false);
_target.detachSelf();
_target = null;
targets.remove();
break;
}
if(well.checkRectangle.collidesWith(_target))
{
@SuppressWarnings("unchecked")
ArrayList<Integer> userData = (ArrayList<Integer>)_target.getUserData();
manageEffects(userData);
_target.setVisible(false);
_target.detachSelf();
_target.clearEntityModifiers();
_target.clearUpdateHandlers();
_target.reset();
_target = null;
targets.remove();
}
}
targetPoint.addAll(collectedPoint);
collectedPoint.clear();
checkCompletedScore();
}
};
任何想法,为什么每次在屏幕上添加新项目时游戏都会冻结。
答案 0 :(得分:4)
你需要使用精灵池。我有类似的问题,通过使用精灵池我可以解决它
http://c0deattack.wordpress.com/2011/01/06/andengine-using-the-object-pool/