1

これまでのところ、次の(簡略化された)リグがあります。

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 オブジェクト)。 .

正しい方向へのヒントは大歓迎です!

4

2 に答える 2