2013-12-18 53 views
-1

我使用libgdx製作簡單的遊戲。我想在其他線程中顯示精靈(不在主線程中)。但是如果我跑了那裏沒有精靈。在我的logcat中,我看到了精靈的實例,但圖形不顯示。 我的代碼:不會在線程中顯示精靈

@Override 
public void render() {  
    Gdx.gl.glClearColor(1, 1, 1, 1); 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    rbg.render(); 
    camera.update(); 
    Thread th = new Thread(new Runnable(){ 

     @Override 
     public void run() { 
      Gdx.app.postRunnable(new Runnable(){ 
       @Override 
       public void run() { 
        camera.update(); 
        batch.getProjectionMatrix(); 
        pokazPostac(); 

       } 

      }); 

     } 

    }); 
    th.start(); 
    } 

public void pokazPostac(){ 
    Random r = new Random(); 
    batch.setProjectionMatrix(camera.combined); 
    spriteb.setSize(64, 100); 
    batch.begin(); 

    switch (r.nextInt(6)){ 

    case 0: 
     spriteb.setPosition(64, 128); 
     spriteb.draw(batch); 
     Gdx.app.log("", ""+spriteb.getX()); 
     break; 
    case 1: 
     spriteb.draw(batch); 
     spriteb.setPosition(192, 256); 
     break; 
    case 2: 
     spriteb.draw(batch); 
     spriteb.setPosition(320, 128); 
     break; 
    case 3: 
     spriteb.draw(batch); 
     spriteb.setPosition(448, 256); 
     break; 
    case 4: 
     spriteb.draw(batch); 
     spriteb.setPosition(640, 128); 
     break; 
    case 5: 
     spriteb.draw(batch); 
     spriteb.setPosition(704, 256); 
     break; 
    } 
    batch.end(); 
} 

回答

3

因爲你這個標記和OpenGL,那麼你應該記住,OpenGL是單線程,並可能一些新的特點的多線程渲染的異常被認爲是一個錯誤。

所以通常你創建一個窗口,爲其分配OpenGL,之後你可以調用OpenGL函數。因此,如果這些步驟中的任何一個在不同的線程中完成,它很可能會失敗。所以基本上當你創建一個上下文時,它只能在當前的1個線程中,你可以切換,如果你想但可能會引入一個放緩。所以,因爲你的背景是在線程1 當前和嘗試調用OpenGL函數從線程2這些調用將失敗,因爲當前背景下是沒有線程2

你可以做什麼但是就是你更新你在哪裏像在單獨的線程中做「物理」一樣,並將這些更改提交到渲染線程中,但即使在這種情況下,您也必須從您創建窗口+初始化OpenGL的相同線程進行渲染,或者只是簡單地使用單個線程化設計。

+1

謝謝,我創建了實現Runnable的新類。在render()中,我調用newClass.run();一切都很好。 – user978758