Android OpenGL queueEvent为什么?

时间:2014-08-19 16:53:21

标签: android opengl-es

这有什么不同:

queueEvent(new Runnable(){

@Override
public void run() {
 mRenderer.method();
}});

而且:

mRenderer.method();

OpenGL FPS有什么好处?

1 个答案:

答案 0 :(得分:7)

GLSurfaceView创建一个单独的渲染线程。在OpenGL中,您需要一个当前上下文来进行任何OpenGL调用。 "当前背景" state是每个帖子GLSurfaceView为您创建一个OpenGL上下文,并使其适用于您实现的任何GLSurfaceView.Renderer覆盖。因此,只要你在这些方法中进行OpenGL调用,你就不必担心任何这些问题,它只是像纯魔术一样工作(嗯,它不是真正的神奇,但隐藏了很多复杂性)。

基于此,您无法通过UI线程进行OpenGL调用而无需跳过箍。因此,只需在Renderer上调用某个方法即可。由用户输入触发,然后在该方法中进行OpenGL调用将失败。除此之外,即使您没有在方法中进行OpenGL调用,如果方法访问/修改了渲染线程也使用的Renderer的成员变量,您必须担心线程安全。 / p>

使用queueEvent()提供了一种在渲染线程中执行方法的便捷方法。因此,您不必担心Renderer成员变量的线程安全性,因为所有访问都将在呈现线程中发生。

如果您通过queueEvent()提交OpenGL,我相信您也可以在该方法中进行OpenGL调用。但是我不完全确定OpenGL上下文在呈现线程中是否总是最新的,或者只有在调用Renderer方法覆盖时才能保证这一点。更简单的做法是更改Renderer中的状态以响应用户输入,然后在覆盖Renderer.onDrawFrame()时使用该新状态。