我对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
有两部分,Surface
和View
中的一些假东西。 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
的作用。 SurfaceView
。 关于android - TextureView与GLSurfaceView或如何与EGL14一起使用GLSurfaceView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21305651/