这之间有什么不同:
queueEvent(new Runnable(){
@Override
public void run() {
mRenderer.method();
}});
还有这个:
mRenderer.method();
什么对 OpenGL FPS 更好?
最佳答案
GLSurfaceView
创建一个单独的渲染线程。在 OpenGL 中,您需要一个当前上下文来进行任何 OpenGL 调用。 “当前上下文”状态是每个线程。 GLSurfaceView
为您创建一个 OpenGL 上下文,并使其成为您实现的任何 GLSurfaceView.Renderer
覆盖的当前上下文。因此,只要您在这些方法中进行 OpenGL 调用,您就不必担心任何这些,它就像纯粹的魔法一样工作(好吧,它并不是真正的魔法,但隐藏了很多复杂性)。
基于此,您无法从 UI 线程进行 OpenGL 调用而不跳过箍。因此,只需在 Renderer
上调用一个方法,例如由用户输入触发,然后在该方法中进行 OpenGL 调用,将会失败。除此之外,即使您不在该方法中进行 OpenGL 调用,如果该方法访问/修改渲染线程也使用的 Renderer
的成员变量,您也必须担心线程安全。
使用 queueEvent()
提供了一种在渲染线程中执行方法的便捷方式。所以你不必担心Renderer
成员变量的线程安全,因为所有的访问都将发生在渲染线程中。
如果您通过 queueEvent()
提交,我相信您也可以在该方法中进行 OpenGL 调用。但我不完全确定 OpenGL 上下文在渲染线程中是否始终是当前的,或者是否只有在调用 Renderer
方法覆盖时才能保证。更典型的做法是仅更改 Renderer
中的状态以响应用户输入,然后在覆盖 Renderer.onDrawFrame()
时使用该新状态。
关于Android OpenGL queueEvent 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25388929/