我在開發中的libgdx迷你遊戲中出現了一個經常性的「隨機」致命錯誤。對於我所蒐集的內容,這是一個與機體創建有關的box2d原生錯誤。造成這種情況的一個可能原因是在一個時間步中產生一個身體,但我相信我採取了適當的對策。爲什麼我在創建LIbgdx中的物體時有時會出現box2Dragsh
以下情況看起來很相似,但實際上是關於從數組中刪除對象的同時通過它循環的: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(一個大的抽象blob)繼承而來。它們都有一個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 ------");
實體
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僞的missusage(1F/PPM)'導致太小的物體會爆炸。但是,我試圖擴大一點,我仍然有這個問題。我仍在調查。 – MeMeek