gpt4 book ai didi

java - GLES2 TouchEventPool 耗尽

转载 作者:行者123 更新时间:2023-11-29 21:43:45 27 4
gpt4 key购买 nike

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

 @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)的其他 Sprite (敌人)。它们的位置和速度会根据与玩家的距离而变化。因此,所有数据都在下一个方法中更新:

@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 was exhausted, with 2 item not yet recycled. Allocated 1 more. 05-05 17:13:06.539: V/AndEngine(2676): org.andengine.util.adt.pool.PoolUpdateHandler$1 was exhausted, with 2 item not yet recycled. Allocated 1 more. 05-05 17:13:06.559: V/AndEngine(2676): org.andengine.input.touch.TouchEvent$TouchEventPool was exhausted, with 3 item not yet recycled. Allocated 1 more. 05-05 17:13:06.559: V/AndEngine(2676): org.andengine.util.adt.pool.PoolUpdateHandler$1 was exhausted, with 3 item not yet recycled. Allocated 1 more. 05-05 17:13:06.579: V/AndEngine(2676): org.andengine.input.touch.TouchEvent$TouchEventPool was exhausted, with 4 item not yet recycled. Allocated 1 more. 05-05 17:13:06.579: V/AndEngine(2676): org.andengine.util.adt.pool.PoolUpdateHandler$1 was exhausted, with 4 item not yet recycled. Allocated 1 more.

and etc.

有人遇到过这个问题吗?

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

最佳答案

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

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

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

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

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

关于java - GLES2 TouchEventPool 耗尽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16388549/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com