2013-06-03 51 views
1

我有以下(簡化的)鑽機到目前爲止:的OpenGL ES和線程結構

MyActivity.java:

public class MyActivity extends Activity { 
public GLSurfaceView myGLView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     myGLView = new MyGLSurfaceView(this); 
     setContentView(myGLView); 
    } 
} 

MyGLSurfaceView.java:

public class MyGLSurfaceView extends GLSurfaceView { 
    private MyRenderer mMyRenderer = new MyRenderer(); 
    private MyThread mMyThread = new MyThread(); 

    public MyView(Context context) { 
     super(context); 
     setRenderer(mGameRenderer); 
     setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); 
     mGameThread.setRunning(true); 
    } 
} 

MyRenderer.java:

public class GameRenderer implements GLSurfaceView.Renderer { 
    @Override 
    public void onDrawFrame(GL10 gl) { 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
     // ... 
    } 
} 

MyThread.java:

在這裏,我做的所有的初始化,創建對象等等。

public class MyThread extends Thread { 
    private MyObject mMyObject = new MyObject(); 
    public MyThread { 
     // ... 
     mMyObject.setRot(); 
     this.start(); 
    } 

    public void run() { 
     // Fixed Timestep Loop goes here 
     mMyObject.getRot(); 
    } 
} 

MyObject.java:

這是保持不同的Fileds和方法樣品物體。

public class MyObject { 
    private double mRot; 

    // Getters & Setters 
    protected double getRot() { return mRot; } 

    protected void setRot() { 
     // ... Do calculations 
    } 

    public void draw() { 
     // OGL Instructions go here 
     gl.glRotatef(1.2f, 0, 0, setRot()); 
    } 
} 

現在我正在運行到問題如下:在MyThread的類(我猜,我錯過了一些非常基本的和簡單的:)) 如上所述,我創建我的對象實例。線程在MyGLSurface類中創建,對於Renderer也是如此。現在,我有兩個線程我無法弄清楚,如何在這兩個單獨的線程中使用這個實例及其方法。 我嘗試了不同的方法,但沒有任何工作。所以我認爲我在課堂設計中犯了一個錯誤。我的意思是,我不只是想讓它運行(這很容易),但我想知道如何正確地做到這一點。 主要問題實際上是我無法訪問MyObject的實例,只是在渲染器中使用draw()方法 - 因爲我不明白它。

我想,可以在渲染線程內調用MyObject的draw()方法而不需要使用單例等等。所以簡單地引用實例即可。但不知何故,這似乎很奇怪和骯髒(除了它不適用於我)。 我嘗試了幾十種不同的方法,但我確實需要一個正確的方向。我非常喜歡面向對象,但在這裏我可能會錯過一些東西。

在網上找到的很多示例(stackoverflow,Replica Island,不同的教程網站,Google I/O,DevCentral等)中,他們要麼沒有使用多線程系統,要麼直接將其拆分(GL對象來自普通物體)。

任何暗示正確的方向將不勝感激!

回答

1

又如細讀:

https://code.google.com/p/android-breakout/

維基和代碼註釋討論使用GLSurfaceView固有的線程問題。特別是,遊戲在Renderer線程開始之前完成了儘可能多的設置;一旦運行,儘可能多的工作在該線程上完成。遊戲狀態對象有效地由渲染器線程「擁有」,並且Activity由UI線程擁有,所以任何「脫機線程」交互都通過發送消息來處理,而不是直接進行方法調用。例如,請參閱handling of touch events

這很好,你在想這個 - 你需要同步或小心的對象紀律以避免惡劣的競爭條件。

另請參閱:android game loop vs updating in the rendering thread

0

GLSurfaceView的好處在於它爲您創建了OpenGL渲染線程,因此您不需要自己創建一個。主UI線程將調用視圖類中的OnDraw()方法,這就是您需要的所有線程。如果您真的想爲OpenGL渲染創建自己的線程,請使用TextureView而不是GLSurfaceView。這裏是我認爲這將有助於一篇文章:

http://software.intel.com/en-us/articles/porting-opengl-games-to-android-on-intel-atom-processors-part-1