これまでのところ、次の(簡略化された)リグがあります。
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:
これは、さまざまなフィールドとメソッドを保持するサンプル オブジェクトです。
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 クラスでオブジェクト インスタンスを作成しています。Thread は MyGLSurface クラスで作成されます。Renderer も同様です。2 つのスレッドがあるので、その 1 つのインスタンスとそのメソッドを 2 つの別々のスレッドで使用する方法がわかりません。さまざまなアプローチを試みましたが、何もうまくいきませんでした。私の意見では、クラスの設計に誤りがありました。つまり、実行したいだけではなく (それは非常に簡単です)、正しく実行する方法を知りたいのです。主な問題は、実際には、MyObject のインスタンスにアクセスできず、レンダラーで draw() メソッドを使用できないことです。
シングルトンなどを使わなくてもレンダリングスレッド内で MyObject の draw() メソッドを呼び出せるのではないかと思いました。したがって、単にインスタンスを参照するだけです。しかし、どういうわけかそれは奇妙で汚いように見えました(それ以外に、私にはうまくいきません)。何十もの異なるアプローチを試しましたが、正しい方向へのバンプが本当に必要です. 私は OOP にかなり精通していますが、ここでは本当に何かを見逃している可能性があります。
Web で見つけた多くのサンプル (stackoverflow、Replica Island、さまざまなチュートリアル サイト、Google I/O、DevCentral など) では、マルチスレッド システムを使用していないか、直接分割しています (通常のオブジェクトから GL オブジェクト)。 .
正しい方向へのヒントは大歓迎です!