这有什么不同:
queueEvent(new Runnable(){
@Override
public void run() {
mRenderer.method();
}});
而且:
mRenderer.method();
OpenGL FPS有什么好处?
答案 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()
时使用该新状态。