java - 如何在 run() 方法内部传递 GL10 对象

标签 java android opengl-es

我相信我遇到的问题是,除非我在 gameview.drawFrame() 中使用 GL10 gl,否则 gameThread 将无法工作。我尝试创建一个对象 gl 传递它,但仍然无法工作。另外使用 game.onResume 更新游戏是错误的吗? 我在 Main.class 中创建了一个 gameThread 实例,并对

public class GameThread extends Thread {
Object  gl;
private static int MAX_FRAME_SKIPS;
private static int FRAME_PERIOD;
private OpenGLActivity game;
private MyGLRenderer gameView;
private boolean gameRunning = true;
private boolean running = false;
Handler handler = new Handler();

public GameThread( int maxFPS, int maxFrameSkips) {
    game = new OpenGLActivity();
    gameView = new MyGLRenderer();
    MAX_FRAME_SKIPS = maxFrameSkips;
    FRAME_PERIOD = 1000 / maxFPS;
    gl = new Object();
}

@Override
public void run() {
    long beginTime;
    long timeDiff;
    int sleepTime;
    int framesSkipped;
    beginTime = System.currentTimeMillis();
    framesSkipped = 0;
    this.gameRunning = this.game.isRunning();
    this.game.onResume(); // Update game
    this.gameView.onDrawFrame((GL10) gl);    // Render the game
    timeDiff = System.currentTimeMillis() - beginTime;  // Calculate cycle length
    sleepTime = (int) (FRAME_PERIOD - timeDiff);         // Calculate time available to sleep

    // Checks if got time to sleep, either sleeps thread or catches up
    if (sleepTime > 0) {
        if (this.gameRunning && running) {
            handler.postDelayed(this, sleepTime);
        }
        while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {
            this.game.onResume();                         // Update without rendering
            sleepTime += FRAME_PERIOD;                  // Add frame period to check if in next frame
            framesSkipped++;
            if (this.gameRunning && running) {
                this.run();                             // No time to wait! RUN! CATCH UP!
            }
        }
    }
}

public void setRunning(boolean running) {
    this.running = running;
}

}

public class Main extends Activity{

    GameThread gt = new GameThread(48, 100);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
    }

    public void PlayGame(View v) {
        Intent intent = new Intent(Main.this, OpenGLActivity.class);
        startActivity(intent);
        gt.setRunning(true);
    }

最佳答案

您没有 GL10 对象这一事实只是这里的一个症状。事实上,我认为 Android 上从未使用过这种方式。它是 javax.microedition.khronos.opengles 包的一部分,我认为它是某种标准 Java OpenGL ES 接口(interface)。我不确定它是否有效,但我肯定从未见过有人使用它。

Android 中常用的 OpenGL 接口(interface)位于 android.opengl 包中,名称为 GLES10 , GLES11 , GLES20 , GLES30 , GLES31 .

在这些类上,所有方法都是静态的。因此,您永远不需要对象实例来进行 OpenGL 调用。

但是,这就是您的实际问题:要进行 OpenGL 调用,您需要创建一个 OpenGL 上下文,并将其设置为当前上下文。您还需要一个渲染表面。有两个主要选项:

  • 使用 EGL14 的(中等)困难的方法接口(interface)(或 EGL10 如果您需要支持低于 17 的 API 级别)。
  • 您可以选择更方便且使用广泛的路线,并使用 GLSurfaceView ,它为您创建上下文和渲染表面。

我建议您从 Android 文档中的官方教程开始。一旦你经历过这个:http://developer.android.com/training/graphics/opengl/index.html,以上所有内容都会变得更加清晰。 .

您还应该知道 OpenGL ES 1.x 大多数情况下被认为已过时。如今,ES 2.0 及更高版本的使用更加广泛。

关于java - 如何在 run() 方法内部传递 GL10 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29049434/

相关文章:

XHTML 上出现 Java EE 404 错误,但 HTML 上没有

java - JPA中的事务实现

Android - 支持的图像类型

javascript - 使用带有时间序列数据的three.js

java - 如何使用 GWT 处理文件上传?

java - 查找 A^5 + B^5 + C^5 所有可能值的算法?

java - 我试图设置一个全局变量类,但它崩溃了。我缺少什么吗?

java - 导入未知的java类?

ios - 在OpenGL的类中更改C结构的值- objective-c

opengl-es - 如何在 webgl 渲染 channel 之间传递高精度 uv 坐标?