我对EGL感到困惑。

我的GLSurfaceView创建一个EGLContext。现在,我创建一个共享上下文。现在,我需要使用EGLExtension。

我必须使用的方法称为(> = API18):

EGLExt.eglPresentationTimeANDROID(android.opengl.EGLDisplay display, android.opengl.EGLSurface surface, long time);

问题是,GLSurfaceView只会创建javax.microedition.khronos.egl.EGLContext。

这告诉我,不要使用GLSurfaceView。因此,我尝试了TextureView,它有点类似,不同之处在于您必须处理自己的EGL内容。为此目的是好的。

但:
TextureView较慢,至少看起来像这样,所以我用Method Profiler记录了一些图表:

这是带有自己的EGL处理的TextureView:

顶部的Thread是一个时钟,它在中间唤醒了Thread,并渲染到TextureView上。之后将调用主线程,以重绘TextureView。

...这里是带有自己的EGL处理的GLSurfaceView
时钟在这次的中间,它调用顶部的Thread将我的图像渲染到帧缓冲区中,然后直接将其提供给SurfaceView(RENDERMODE_WHEN_DIRTY),然后调用requestRender请求渲染 View 。

就像您已经看到的那样,使用GLSurfaceView看起来比使用TextureView看起来更干净。

在这两个示例中,我在屏幕上都没有其他任何东西,并且它们使用相同的着色器渲染了完全相同的网格。

对我的问题:
有没有办法在EGL14上下文中使用GLSurfaceView?

我做错什么了吗?

最佳答案

您可能想要做的是使用普通的SurfaceView

这是简短的版本:

  • SurfaceView有两部分,SurfaceView中的一些假东西。 Surface直接传递到表面合成器(SurfaceFlinger),因此当您使用OpenGL在其上进行绘制时,开销相对较小。这使其速度很快,但也使其在View层次结构中不能正确播放,因为Surface在一层上,而基于View的UI在另一层上。
  • TextureView也有两个部分,但是您借鉴的那部分生活在幕后(这是SurfaceTexture出现的地方)。框架完成后,您绘制的内容将被涂抹到“ View ”层上。 GPU可以快速完成此任务,但是“一些工作”总是比“没有工作”要慢。
  • GLSurfaceView是带有包装器类的SurfaceView,该包装器类为您执行所有EGL设置和线程间消息传递。

  • 编辑:,长版本可用here

    如果您可以自己进行GL/EGL设置和线程管理-如果您现在在TextureView上运行,则可以这样做-那么您应该使用简单的SurfaceView

    说了这么多,应该可以使原始代码与GLSurfaceView一起工作。我希望您希望在与eglPresentationTimeANDROID()共享的EGL上下文中调用GLSurfaceView,而不是从GLSurfaceView本身内部调用,因此GLSurfaceView在内部使用EGL10无关紧要。共享上下文重要的是上下文客户端版本(例如GLES2与GLES3),而不是用于配置上下文的EGL接口(interface)版本。

    您可以在Grafika中看到所有这些示例。尤其是:
  • “显示+捕获摄像机”使用GLSurfaceView,摄像机和视频编码器。请注意,EGL上下文是共享的。该示例令人费解,有些痛苦,主要是因为它故意使用GLSurfaceView和共享的EGL上下文。 (更新:请注意this issue有关具有共享上下文的比赛条件。)
  • “播放视频(TextureView)”和“TextureView中的基本GL”显示TextureView的作用。
  • “使用FBO记录GL应用程序”使用纯SurfaceView
  • 关于android - TextureView与GLSurfaceView或如何与EGL14一起使用GLSurfaceView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21305651/

    10-11 20:27