Android OpenGL queueEvent 为什么?

标签 android opengl-es

这之间有什么不同:

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/

相关文章:

android - glSurfaceView 和 camera onResume 问题

android - 亚行未发现/识别 LG G4

android - 如何在 Android 2.0 上读取联系人

android - 是安卓:id attribute required for all views in my layout?

c - 纹理不随 OpenGL 旋转 (C)

ios - 如何在SceneKit中正确照亮自定义网格而不炫耀网格的不规则性?

android - RecyclerView 项目在滚动时点击

android - 仅在 Android 浏览器上无法正确显示背景图像

android - 将 ShaderToy 转换为 fragment 着色器

android - OpenGL (ES) -- 截锥体和正视体有什么区别?