K. Barresi
K. Barresi

Reputation: 1315

AndEngine: Getting a SIGSEGV and TouchEventPool Events

I'm developing a game with android using andengine. Basically, I'm using 2 ArrayList to store my 2 types of Sprites. I'm adding and removing both types of Sprite at runtime, in reaction to user interaction. However, I'll get random crashes with only the following error codes:

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.

As I continue to move my finger on the screen, the TouchEvent pool warnings continue popping up, but the game itself is hung. I honestly have no idea what is causing this! I've done a lot of looking around, and can't even pinpoint the crash on a single action.

My method of creating/removing my Sprites is as follows:

TypeASprite:

TypeBSprite:

Each time a Sprite is created, it's added to its respective ArrayList. When it needs to be removed, it's removed from the ArrayList through the ContactListener.

Any help/ideas would be really appreciated! Thanks!

EDIT: Through some trial and error, I'm pretty sure the issue is with the TypeBSprite

EDIT: I've implemented my TypeBSprite creation like this:

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)); 
    }
});

Upvotes: 2

Views: 1714

Answers (2)

Raj
Raj

Reputation: 33

Main reason of error Fatal signal 11 (SIGSEGV) at 0x28ac9648 (code=1) is due to stack is full you need to clear stack on runtime or recycle

look in log cat you are allocating items but not recycling

its also giving error with 6 item not yet recycled

thus if u keep on recycling older items you wll find game working fine without any error

Upvotes: 1

K. Barresi
K. Barresi

Reputation: 1315

Figured it out! The problem lies in the time gap between registering an runOnUpdateThread Runnable and the actual execution of it. The problem was that the ContactListener was being called multiple times for the same collision, and thus the runOnUpdateThread being used to delete the bodies was being called multiple times on the same object.

To fix it, I made the ContactListener set the UserData of the Sprite to "deleted". When the ContactListener was called again on the same object, the "if (...) statements comparing Sprite's UserData would ignore it, since it should be on the road to deletion already.

Hope this helps someone in the future!

Upvotes: 4

Related Questions