2

andengineを使用してAndroidでゲームを開発しています。基本的にArrayList、2 種類のスプライトを格納するために 2 を使用しています。Spriteユーザーの操作に応じて、実行時に両方のタイプを追加および削除しています。ただし、次のエラー コードのみでランダムなクラッシュが発生します。

10-09 12:11:13.532: A/libc(8015): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)
10-09 12:11:13.572: V/AndEngine(8015): org.andengine.input.touch.TouchEvent$TouchEventPool<TouchEvent> was exhausted, with 2 item not yet recycled. Allocated 1 more.
10-09 12:11:13.572: V/AndEngine(8015): org.andengine.util.adt.pool.PoolUpdateHandler$1<TouchEventRunnablePoolItem> was exhausted, with 2 item not yet recycled. Allocated 1 more.
10-09 12:11:13.602: V/AndEngine(8015): org.andengine.input.touch.TouchEvent$TouchEventPool<TouchEvent> was exhausted, with 3 item not yet recycled. Allocated 1 more.
10-09 12:11:13.602: V/AndEngine(8015): org.andengine.util.adt.pool.PoolUpdateHandler$1<TouchEventRunnablePoolItem> was exhausted, with 3 item not yet recycled. Allocated 1 more.
10-09 12:11:13.622: V/AndEngine(8015): org.andengine.input.touch.TouchEvent$TouchEventPool<TouchEvent> was exhausted, with 4 item not yet recycled. Allocated 1 more.
10-09 12:11:13.622: V/AndEngine(8015): org.andengine.util.adt.pool.PoolUpdateHandler$1<TouchEventRunnablePoolItem> was exhausted, with 4 item not yet recycled. Allocated 1 more.
10-09 12:11:16.195: V/AndEngine(8015): org.andengine.input.touch.TouchEvent$TouchEventPool<TouchEvent> was exhausted, with 5 item not yet recycled. Allocated 1 more.
10-09 12:11:16.195: V/AndEngine(8015): org.andengine.util.adt.pool.PoolUpdateHandler$1<TouchEventRunnablePoolItem> was exhausted, with 5 item not yet recycled. Allocated 1 more.
10-09 12:11:16.275: V/AndEngine(8015): org.andengine.input.touch.TouchEvent$TouchEventPool<TouchEvent> was exhausted, with 6 item not yet recycled. Allocated 1 more.
10-09 12:11:16.275: V/AndEngine(8015): org.andengine.util.adt.pool.PoolUpdateHandler$1<TouchEventRunnablePoolItem> was exhausted, with 6 item not yet recycled. Allocated 1 more.

画面上で指を動かし続けると、TouchEventプールの警告がポップアップし続けますが、ゲーム自体はハングします。正直なところ、何が原因なのかわかりません!私は多くのことを調べましたが、単一のアクションでクラッシュを特定することさえできません.

スプライトを作成/削除する私の方法は次のとおりです。

TypeAスプライト:

  • の中に作成するTimerHandler
  • ContactListener産卵中を取り除くrunOnUpdateThread() Runnable

TypeBSprite :

  • ActivityonSceneTouchEvent()IOnSceneTouchListener.
  • ContactListener産卵中を取り除くrunOnUpdateThread() Runnable

が作成されるたびSpriteに、それぞれの に追加されますArrayListArrayList削除する必要がある場合は、を通じてから削除されContactListenerます。

どんな助け/アイデアも本当に感謝しています! ありがとう!

編集:いくつかの試行錯誤を通じて、問題は TypeBSprite にあると確信しています

編集: TypeBSprite の作成を次のように実装しました。

mEngine.runOnUpdateThread(new Runnable() {
    @Override
    public void run() {
        AnimatedSprite sprite = new AnimatedSprite(sX, sY, mSpriteRegion, getVertexBufferObjectManager());

        sprite.setRotation(sRotation);
        mScene.attachChild(sprite);

        Body body = PhysicsFactory.createBoxBody(mPhysicsWorld, sprite, BodyType.StaticBody, MY_FIXTURE);
        sprite.setUserData("spiteB");
        body.setUserData(sprite);
        mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(sprite, body, true, true)); 
    }
});
4

2 に答える 2

4

理解した!runOnUpdateThread Runnable問題は、を登録してから実際に実行するまでの時間差にあります。問題はContactListener、同じ衝突に対してが複数回呼び出されていたためrunOnUpdateThread、ボディを削除するために使用されていたものが同じオブジェクトに対して複数回呼び出されていたことです。

これを修正するために、スプライトのContactListenerセットUserDataを「削除済み」にしました。ContactListenerが同じオブジェクトで再度呼び出された場合、「 」if (...)を比較するステートメントはそれを無視します。これは、すでに削除への道を進んでいるはずだからです。SpriteUserData

これが将来誰かに役立つことを願っています!

于 2012-10-15T04:16:50.287 に答える