Android OpenGL queueEvent为什么?

Fil*_*lip 3 android opengl-es

这有什么不同:

queueEvent(new Runnable(){

@Override
public void run() {
 mRenderer.method();
}});
Run Code Online (Sandbox Code Playgroud)

还有这个:

mRenderer.method();
Run Code Online (Sandbox Code Playgroud)

什么是更好的OpenGL FPS?

Ret*_*adi 7

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

基于此,您无法通过UI线程从UI线程进行OpenGL调用.因此,简单地调用一个方法Renderer,例如由用户输入触发,然后在该方法中进行OpenGL调用,将失败.除此之外,即使您没有在方法中进行OpenGL调用,如果方法访问/修改Renderer渲染线程也使用的成员变量,您必须担心线程安全.

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

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