到目前为止,我有以下(简化的)装备:
我的活动.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();
}
}
我的对象.java:
这是一个包含不同字段和方法的示例对象。
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 类中创建的,渲染器也是如此。现在,我有两个我不知道的线程,如何在这两个单独的线程中使用那个实例及其方法。我尝试了不同的方法,但没有任何效果。所以在我看来,我在课堂设计上犯了一个错误。我的意思是,我不只是想让它运行(这很容易),但我想知道如何正确地做到这一点。主要问题实际上是我无法访问 MyObject 的实例,而只能在渲染器中使用 draw() 方法——因为我不明白。
我想,可以在渲染线程中调用 MyObject 的 draw() 方法,而无需使用单例等。所以简单地引用它的实例。但不知何故,这似乎很奇怪和肮脏(除了它对我不起作用)。我尝试了几十种不同的方法,但我真的需要朝着正确的方向前进。我对 OOP 很熟悉,但在这里我可能真的会错过一些东西。
在我在网上找到的许多示例中(stackoverflow、Replica Island、不同的教程站点、Google I/O、DevCentral 等),它们要么没有使用多线程系统,要么直接将其拆分(GL 对象与常规对象) .
任何指向正确方向的提示将不胜感激!