2016-03-31 23 views
0

Ben topları itme ile basit bir test android uygulaması yazdı. Cihazımda fazla 20-30 topları itmek zaman , uygulaması bu hata 5-10 toplarla meydana emülatörü üzerinde hataLibGDX Box2d Android kilitlenme "Ölümcül sinyal 11 (SIGSEGV), kod 1, hata addr ..."

03-31 17:07:08.414 6778-6778/com.example.balls A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x58 in tid 6778 (bm.examle.balls) 

çöker.

LibGDX ile Box2D fiziğini öğrenmeye başladım. Box2D'nin binlerce cismi işlemesine izin verdiğini okudum.

Yani, Box2D'yi kullanırken bir şey anlamadığımı düşünüyorum. Lütfen bana bir çok interaktif kurumu olan bir program veya tavsiye veya örnek verebilir misiniz?

libgdx çekirdek projesinin kodu:

public class BallGame extends ApplicationAdapter { 

BallParameters ballParameters; 

volatile boolean stopWorld = false; 

//parameters from Android Application 
public BallGame(BallParameters ballParameters){ 
    this.ballParameters = ballParameters; 
} 

World world; 
Box2DDebugRenderer debugRenderer; 
OrthographicCamera camera; 

//factor to adjust the size 
private final float n = 0.05f; 

@Override 
public void create() { 
    //create camera 
    camera = new OrthographicCamera(Gdx.graphics.getWidth()*n, Gdx.graphics.getHeight()*n); 
    camera.position.set(new Vector3(Gdx.graphics.getWidth()/2f*n, Gdx.graphics.getHeight()/2f*n, 10f)); 
    camera.near = 1f; 
    camera.far = 20f; 
    camera.update(); 
    //create world 
    world = new World(new Vector2(0, -50), true); 
    debugRenderer = new Box2DDebugRenderer(); 
    //It creates borders around the edges of the screen 
    createGround(); 
    createLeftWall(); 
    createRightWall(); 
    createCelling(); 
} 

@Override 
public void render() { 
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    debugRenderer.render(world, camera.combined); 
    doPhysicsStep(Gdx.graphics.getDeltaTime()); 
} 

//physics step, (from libgdx documentation https://github.com/libgdx/libgdx/wiki/Box2d#stepping-the-simulation) 
private float accumulator = 0; 
private float TIME_STEP = 1/60f; 
private void doPhysicsStep(float deltaTime) { 
    if(stopWorld) return; 
    float frameTime = Math.min(deltaTime, 0.25f); 
    accumulator += frameTime; 
    while (accumulator >= TIME_STEP) { 
     world.step(TIME_STEP, 6, 2); 
     accumulator -= TIME_STEP; 
    } 
} 

//creates a ball and applies linear impulse with parameters from android application 
//blocks stepping the world during creating ball 
//calls from android application 
public void pushBall(){ 
    stopWorld = true; 
    Body ball = createBall(40*n, 40*n); 
    int velocity = ballParameters.getVelocity(); 
    int angleDeg = ballParameters.getAngle(); 
    int vx = (int) (velocity*Math.cos(Math.toRadians(angleDeg))); 
    int vy = (int) (velocity*Math.sin(Math.toRadians(angleDeg))); 
    ball.applyLinearImpulse(vx, vy, ball.getPosition().x, ball.getPosition().y, true); 
    stopWorld = false; 
} 

//creates a ball in a fixed place 
private Body createBall(float x, float y){ 
    BodyDef bodyDef = new BodyDef(); 
    bodyDef.type = BodyDef.BodyType.DynamicBody; 
    bodyDef.position.set(x, y); 
    Body body = world.createBody(bodyDef); 
    CircleShape circle = new CircleShape(); 
    circle.setRadius(50*n); 
    FixtureDef fixtureDef = new FixtureDef(); 
    fixtureDef.shape = circle; 
    fixtureDef.density = 0f; 
    fixtureDef.friction = 0f; 
    fixtureDef.restitution = 1f; 
    body.createFixture(fixtureDef); 
    circle.dispose(); 
    return body; 
} 

Bana yardım eder!

cevap

0

Bellek probleminiz var gibi görünüyor. Topu itirken olduğu gibi, araştırmak için ilk önce pushBall yöntemine bakmalısınız. volatile boolean stopWorld'dan şüpheleniyorum.

kod bloğu bir tür top oyunu başka bir çağrı tarafından işlenir kadar değiştirilmez stopWorld emin olmak istiyorsanız, true ayarlamadan önce stopWorld kontrol etmelidir Eğer bir tür top oyunu yöntemini çağırmak nerede biliyorum ama yapmayın:

public void pushBall() { 
    if(stopWorld) { 
     return; 
    } 

    stopWorld = true; 
    Body ball = createBall(40*n, 40*n); 
    int velocity = ballParameters.getVelocity(); 
    int angleDeg = ballParameters.getAngle(); 
    int vx = (int) (velocity*Math.cos(Math.toRadians(angleDeg))); 
    int vy = (int) (velocity*Math.sin(Math.toRadians(angleDeg))); 
    ball.applyLinearImpulse(vx, vy, ball.getPosition().x, ball.getPosition().y, true); 
    stopWorld = false; 
} 

bu stopWorld alan tanımından uçucu kaldırarak deneyin konuyla yardımcı olmazsa.

volatile boolean stopWorld

+0

boolean stopWorld için Haklısınız. Yeni topu itme sırasında problem ortaya çıkıyor. Hata, dünya nesnesinin senkronizasyonu ile ilişkilidir. Kodu [bu] gibi düzenledim (http://pastebin.com/PSNpbmk9). Çok teşekkür ederim! –

+0

Sorununuzu çözdüğünüze sevindim :) –