У меня возникла повторяющаяся «случайная» фатальная ошибка в мини-игре libgdx, которую я разрабатываю. Для того, что я собрал, это собственная ошибка box2d, связанная с созданием тела. Возможной причиной этого является генерация тела во время тайм-аута, но я считаю, что я принял соответствующие встречные меры.Почему у меня иногда есть box2Dcrash, когда я создаю тела в LIbgdx
Следующий случай кажется похожим, но на самом деле речь шла об удалении объектов из массива при прохождении через него: Deleting and creating body in libGDX.
Что касается моего вопроса, вот выход аварии:
< консоли>
EntityManager: entity generation begin ---------
IceSpike: generating physics
IceSpike: generated physics
IceSpike: generating graphics
EntityManager: entity generation registered
IceSpike: generating physics
IceSpike: generated physics
IceSpike: generating graphics
EntityManager: entity generation registered
IceSpike: generating physics
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000066bcbd0d, pid=5288, tid=0x00000000000013d4
#
# JRE version: Java(TM) SE Runtime Environment (8.0_111-b14) (build 1.8.0_111-b14)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.111-b14 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C [gdx-box2d64.dll+0xbd0d]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\Codage\projects\eclipse\git\spacegame\SpaceGame\android\assets\hs_err_pid5288.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
AL lib: (EE) alc_cleanup: 1 device not closed
Файл журнала: http://pastebin.com/JjBGnTri
Когда речь идет о коде, я буду стараться сделайте как можно проще. Надеюсь, я не режу часть этой проблемы.
У меня есть EntityManager, который обрабатывает поколение и уничтожение моих сущностей. Все объекты в игре наследуются от Entity (большой абстрактный блок). Все они имеют тело box2d, которое генерируется в generatePhysics(World physics)
.
EntityManager
private GameWorld world;
private Array<Entity> generation;
private Array<Entity> generationCpy;
private Array<Entity> trash;
private Array<Entity> trashCpy;
public void update(float delta)
{
//generate new entities
Gdx.app.debug(this.getClass().getSimpleName(), "entity generation begins ---------");
if(generation.size != 0)
{
generationCpy = new Array<Entity>(generation);
for (Entity entity : generationCpy)
{
entity.generate(world.getPhysics(),world.getAssetManager());
}
}
//destroy old entities
Gdx.app.debug(this.getClass().getSimpleName(), "entity destruction begins ---------");
if(trash.size != 0)
{
trashCpy = new Array<Entity>(trash);
for(Entity entity : trashCpy)
{
trash.removeValue(entity, true);
entity.destroy(world.getPhysics());
entity = null;
}
}
Gdx.app.debug(this.getClass().getSimpleName(), "entity generation complete ------");
Entity
public final void generate(World physics, AssetManager assetManager)
{
if(state != EntityState.GENERATED)
{
generatePhysics(physics);
generateGraphics(assetManager);
setState(EntityState.GENERATED);
}
else
Gdx.app.error(this.getClass().getSimpleName(), "entity couldn't be generated. It had allready been generated");
}
До сих пор, только шипы, кажется, это касается, и большую часть времени, все проходит гладко. Остальное время, это врезаться часть:
IceSpikes
@Override
public void generatePhysics(World physics)
{
Gdx.app.debug(this.getClass().getSimpleName(), "generating physics");
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.DynamicBody;
bodyDef.position.set(this.position.cpy().scl(1/PPM));
body = physics.createBody(bodyDef);
body.setBullet(true);
PolygonShape shape = new PolygonShape();
Vector2 vertices[] = new Vector2[3];
vertices[0] = new Vector2(-width/2,-height/2).scl(1f/PPM);
vertices[1] = new Vector2(0,height/2).scl(1f/PPM);
vertices[2] = new Vector2(width/2,-height/2).scl(1f/PPM);
shape.set(vertices);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 1f;
fixtureDef.restitution = 1f;
fixtureDef.filter.categoryBits = CollisionManager.BIT_PROJECTILE;
fixtureDef.filter.maskBits = CollisionManager.BIT_PLAYER;
Fixture fixture = body.createFixture(fixtureDef);
fixture.setUserData(this);
shape.dispose();
Gdx.app.debug(this.getClass().getSimpleName(), "generated physics");
}
Это говорит о том, что связано с созданием синхронизации из IceSpikes, который после столкновения (в world.step()). Тем не менее, это как раз и точка моей системы управления сущностями. Он генерирует/удаляет тела вне world.step(), как кажется, подтверждается выходом.
Кроме того, скопированные массивы настроены таким образом, чтобы предотвратить удаление объектов из массива генерации и мусора, в то время как они пересекаются.
Должно быть, я что-то упустил, но что? Любая идея, как исходить оттуда?
Почему это проголосовало? Я новичок, и я, по крайней мере, знаю, почему, поэтому я могу улучшить свой пост в следующий раз ... – MeMeek
Кто-то на форуме libgdx сказал, что это может произойти из-за промаха '.scl (1f/PPM)', приводящего к слишком маленькие тела, которые затем взорвутся. Тем не менее, я попытался увеличить их немного больше, и у меня все еще есть проблема. Я все еще расследую. – MeMeek