1

到目前为止,我有以下(简化的)装备:

我的活动.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 对象与常规对象) .

任何指向正确方向的提示将不胜感激!

4

2 回答 2

2

另一个要细读的例子:

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

wiki 和代码注释讨论了使用GLSurfaceView. 特别是,游戏在 Renderer 线程启动之前进行了尽可能多的设置;一旦它运行,就会在该线程上完成尽可能多的工作。游戏状态对象实际上由渲染器线程“拥有”,而 Activity 由 UI 线程拥有,因此任何“线程外”交互都是通过发送消息而不是直接调用方法来处理的。例如,请参阅触摸事件的处理

您正在考虑这一点很好——您需要同步或仔细的对象纪律以避免讨厌的竞争条件。

另请参阅:android 游戏循环与渲染线程中的更新

于 2013-06-20T20:12:19.070 回答
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
于 2013-06-14T04:25:14.473 回答