我有以下(簡化的)鑽機到目前爲止:的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對象來自普通物體)。
任何暗示正確的方向將不勝感激!