GLES2 TouchEventPool用尽了

时间:2013-05-05 19:59:16

标签: java android touch andengine

我正在使用onSceneTouchEvent在TMX地图上移动玩家:

 @Override
        public Scene onCreateScene() {
...
                mScene.setOnSceneTouchListener(this);
}

...

@Override
        public boolean onSceneTouchEvent(Scene pScene, final TouchEvent pSceneTouchEvent) {

        switch(pSceneTouchEvent.getAction()) {

        case TouchEvent.ACTION_DOWN:

                        mLastMotionX = pSceneTouchEvent.getX();
                        mLastMotionY = pSceneTouchEvent.getY();

                        break;

        case TouchEvent.ACTION_MOVE:

                        mLastMotionX1 = pSceneTouchEvent.getX();
                        mLastMotionY1 = pSceneTouchEvent.getY();

                        SpeedVector(mLastMotionX, mLastMotionY, mLastMotionX1,
                                        mLastMotionY1);                        
                        break;

        case TouchEvent.ACTION_UP:

                        mLastMotionX2 = pSceneTouchEvent.getX();
                        mLastMotionY2 = pSceneTouchEvent.getY();
                        SpeedVectorStop(mLastMotionX, mLastMotionY, mLastMotionX2,
                                        mLastMotionY2);
                break;         
}

                return false;

        }

...

        public void SpeedVector(float x1, float y1, float x2, float y2) {

                if ((Math.abs(x2 - x1) < 55) && (Math.abs(y2 - y1) < 55)) {


                        float r = (float) Math.sqrt(((x2 - x1) * (x2 - x1))
                                        + ((y2 - y1) * (y2 - y1)));
                        float rx = (x2 - x1) / r;
                        float ry = (y2 - y1) / r;
                        new Vector2(rx * 100, ry * 100);
                        new Vector2(x2, y2);



                        if (speedThread) {
                                mPlayerBody.setLinearVelocity(rx * 15, ry * 15);
                        } else
                                mPlayerBody.setLinearVelocity(rx * 5, ry * 5);

                }
        }


public void SpeedVectorStop(float x1, float y1, float x2, float y2) {
                if ((Math.abs(x2 - x1) < 10) && (Math.abs(y2 - y1) < 10)) {
                        mPlayerBody.setLinearVelocity(0, 0);
                }
        }

现场还有很多追求玩家的精灵(敌人)(简单的AI)。他们的位置和速度根据与玩家的距离而变化。 因此,所有数据都在下一个方法中更新:

@Override
                        public final void onUpdate(final float pSecondsElapsed) {
//some code
}

当我几次触摸现场时 - AndEngine会崩溃 这是一个LogCat:

  

05-05 17:13:06.539:V / AndEngine(2676):   org.andengine.input.touch.TouchEvent $ TouchEventPool是   筋疲力尽,2件尚未回收。分配1个。 05-05   17:13:06.539:V / AndEngine(2676):   org.andengine.util.adt.pool.PoolUpdateHandler $ 1   已经筋疲力尽,还有2件尚未回收。分配1个。 05-05   17:13:06.559:V / AndEngine(2676):   org.andengine.input.touch.TouchEvent $ TouchEventPool是   筋疲力尽,3件尚未回收。分配1个。 05-05   17:13:06.559:V / AndEngine(2676):   org.andengine.util.adt.pool.PoolUpdateHandler $ 1   已经筋疲力尽,还有3件尚未回收。分配1个。 05-05   17:13:06.579:V / AndEngine(2676):   org.andengine.input.touch.TouchEvent $ TouchEventPool是   疲惫不堪,还有4件尚未回收。分配1个。 05-05   17:13:06.579:V / AndEngine(2676):   org.andengine.util.adt.pool.PoolUpdateHandler $ 1   已经筋疲力尽,还有4件尚未回收。分配了1个。

     

等等。

有人遇到过这个问题吗?

问题非常紧迫,尚无解决方案(

1 个答案:

答案 0 :(得分:2)

您的消息由TouchEventPool类中的私有静态成员包含的TouchEventPool生成。

此日志调用由GenericPool<T>类中的第136行生成,但这不是问题,实际上我也在应用程序中收到它们。

只是通知引擎将分配额外的touchEvent,因为它们被重用。

您可以通过在TouchEventPool,public GenericPool(final int pInitialSize)构造函数中调用正确的构造函数,或者通过在TouchEventPool中公开public synchronized void batchAllocatePoolItems(final int pCount),然后使用正确的参数在应用程序中调用它来增加起始池。

顺便说一句,除非你存储TouchEvent(你真的不应该!!如果你需要它,请复制它!),这是一条信息消息,不会让你的应用程序崩溃。