TextureView与GLSurfaceView或如何在EGL14中使用GLSurfaceView

我对EGL感到困惑。

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

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

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

问题是,GLSurfaceView只会创buildjavax.microedition.khronos.egl.EGLContext s。

这告诉我,不要使用GLSurfaceView。 所以我尝试了TextureView,它有点类似,区别在于你必须处理自己的EGL东西。 这对于这个目的是有好处的。

但是:TextureView速度较慢,至less看起来像这样,所以我用Method Profilerlogging了一些图表:

这里有自己的EGL处理的TextureView: 在这里输入图像说明 顶部的线程是一个唤醒中间线程的时钟,它在TextureView上呈现。 之后调用主线程,重绘TextureView。

…和这里的GLSurfaceView与他们自己的EGL处理时钟在这个时候在中间,它调用顶部线程渲染我的图像到一个framebuffer,我直接给了SurfaceView(RENDERMODE_WHEN_DIRTY)和调用requestRender请求视图呈现。 在这里输入图像说明

正如你所看到的,用GLSurfaceView看起来已经很简单了,它看起来比TextureView更干净。

在这两个例子中,我没有在屏幕上有任何东西,他们使用相同的着色器完全相同的网格物体。

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

我做错什么了吗?

Solutions Collecting From Web of "TextureView与GLSurfaceView或如何在EGL14中使用GLSurfaceView"

你可能想要做的是使用一个普通的SurfaceView 。

这是简短的版本:

  • SurfaceView有两个部分, SurfaceSurface的一些假东西。 Surface直接传递到曲面合成器(SurfaceFlinger),所以当你使用OpenGL进行绘制时,其开销相对较小。 这使得它更快,但是它也使得View层次结构不能很好地发挥作用,因为Surface是在一个图层上,基于View的UI在不同的图层上。
  • TextureView也有两个部分,但你绘制的部分生活在幕后(这是SurfaceTexture进来的地方)。 当框架完成时,你绘制的东西被blitting到View层上。 GPU可以做到这一点,但“一些工作”总是慢于“没有工作”。
  • GLSurfaceView是一个带有封装类的SurfaceView ,可以为您执行所有的EGL设置和线程间消息传递。

编辑:长版本可在这里 。

如果你可以自己做GL / EGL设置和线程pipe理 – 如果你现在运行在一个TextureView上,你显然可以 – 那么你应该使用一个普通的SurfaceView

说了这么多,应该可以让你的原始代码和GLSurfaceView工作。 我希望你想在与eglPresentationTimeANDROID()共享的EGL上下文中调用eglPresentationTimeANDROID() ,而不是在GLSurfaceView本身内部GLSurfaceView ,所以GLSurfaceView在内部使用EGL10并不重要。 上下文共享的关键是上下文客户端版本(例如GLES2与GLES3),而不是用于configuration上下文的EGL接口版本。

你可以看到在Grafika工作的所有例子。 尤其是:

  • “显示+捕获相机”使用GLSurfaceView ,相机和video编码器。 注意EGL上下文是共享的。 这个例子是复杂的,有些痛苦,主要是因为它故意试图使用GLSurfaceView和一个共享的EGL上下文。 ( 更新 :注意有关共享上下文竞态条件的问题 。)
  • “播放video(TextureView)”和“ TextureView中的基本GL”显示了TextureView的行动。
  • “用FBOloggingGL应用”使用普通的SurfaceView

感谢fadden! 它按预期工作。

对于每个想要做类似事情的人来说:

它使用(GL)SurfaceView在其上呈现图像具有优点和缺点。

我在上面的post中的testing结果在屏幕上没有任何东西比渲染的图像本身。 如果屏幕上还有其他UI元素,特别是如果他们经常更新,您应该重新考虑我喜欢(GL)SurfaceView的select。

SurfaceView在Android Windows系统中创build一个新窗口。 它的优点是,如果SurfaceView被刷新,只有这个窗口将被刷新。 如果另外更新UI元素(在Windows系统的另一个窗口中),那么两个刷新操作都会阻止自己(尤其是在绘制硬件支持的情况下),因为opengl无法正确处理multithreading绘图。

对于这种情况,使用TextureView可能会更好,因为它不是Android Windows系统的另一个窗口。 所以如果刷新视图,所有UI元素也会刷新。 (可能)在一个线程中的一切。

希望我能帮你们中的一些人!