1

我正在使用 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个。

等等。

有人遇到过这个问题吗?

问题很紧迫,目前还没有解决办法(

4

1 回答 1

2

您的消息由 TouchEventPool 生成,该 TouchEventPool 包含在 TouchEvent 类中作为私有静态成员。

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

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

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

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

于 2013-05-06T20:02:19.717 回答