gpt4 book ai didi

android - OpenGL ES 和线程结构

转载 作者:行者123 更新时间:2023-11-29 21:41:42 25 4
gpt4 key购买 nike

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

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 也是如此。现在,我有两个线程,我不知道如何在两个单独的线程中使用那个实例及其方法。我尝试了不同的方法,但没有任何效果。所以在我看来我在类设计上犯了一个错误。我的意思是,我不只是想让它运行(那很容易),但我想知道如何正确地运行它。主要问题实际上是我无法访问 MyObject 的实例,只能在渲染器中使用 draw() 方法 - 因为我不明白。

我想,可以在渲染线程中调用 MyObject 的 draw() 方法,而不需要使用单例等等。所以简单地引用它的实例。但不知何故,这看起来很奇怪和肮脏(除此之外它对我不起作用)。我尝试了几十种不同的方法,但我真的需要朝着正确的方向前进。我非常熟悉 OOP,但在这里我可能真的会错过一些东西。

在我在网上找到的许多示例中(stackoverflow、Replica Island、不同的教程站点、Google I/O、DevCentral 等),它们要么没有使用多线程系统,要么直接将其拆分(GL 对象来自常规对象)。

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

最佳答案

另一个要细读的例子:

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

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

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

另请参阅:android game loop vs updating in the rendering thread

关于android - OpenGL ES 和线程结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16892067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com