Reputation: 1315
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:
TimerHandler
ContactListener
spawning a runOnUpdateThread()
Runnable
TypeBSprite:
onSceneTouchEvent()
, since the Activity extends an IOnSceneTouchListener
.ContactListener
spawning a runOnUpdateThread()
Runnable
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
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
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