即使一切都在处理程序中,游戏也会冻结几秒钟

时间:2013-09-20 06:10:39

标签: andengine

我一直在为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();  
    }       
};

任何想法,为什么每次在屏幕上添加新项目时游戏都会冻结。

1 个答案:

答案 0 :(得分:4)

你需要使用精灵池。我有类似的问题,通过使用精灵池我可以解决它

http://c0deattack.wordpress.com/2011/01/06/andengine-using-the-object-pool/