android – TextureView与GLSurfaceView或如何使用GLSurfaceView与EGL14

我和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记录了一些图:

这里的TextureView与自己的EGL处理:

顶部的线程是一个唤醒中间的线程的时钟,它呈现在TextureView上。之后将调用主线程,以重新绘制TextureView。

…和这里GLSurfaceView与他们自己的EGL处理
这个时钟在中间,它调用了顶部的线程将我的图像渲染成一个帧缓冲区,我直接将它放到了SurfaceView(RENDERMODE_WHEN_DIRTY)中,并调用requestRender来请求视图呈现。

正如你可以看到一个简短的看法已经与GLSurfaceView它看起来更干净,与TextureView。

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

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

我做错什么了吗?

你可能想要做的是使用一个简单的SurfaceView

这是简短版本:

> SurfaceView有两个部分:Surface和Surface中的一些假的东西。 Surface直接传递到表面合成器(SurfaceFlinger),所以当您使用OpenGL绘制它时,开销相对较小。这使得它很快,但它也使得它不能与View层次结构相当正确,因为Surface位于一个层上,而基于View的UI位于不同的层。
> TextureView也有两个部分,但是您在幕后绘制的部分(这是SurfaceTexture进入的地方)。当框架完成后,您所绘制的东西会被覆盖在View层上。 GPU可以快速完成,但“一些工作”总是比“无工作”慢。
> GLSurfaceView是一个具有包装类的SurfaceView,它为您提供所有的EGL设置和线程间消息传递。

编辑:长版本可用here

如果您可以自己执行GL / EGL设置和线程管理 – 如果您现在运行在TextureView上,您可以清楚地看到 – 那么您应该可以使用一个简单的SurfaceView。

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

您可以在Grafika看到所有这些工作的示例。特别是:

>“显示拍摄相机”使用GLSurfaceView,相机和视频编码器。注意,EGL上下文是共享的。这个例子很复杂,有些痛苦,主要是因为它故意试图使用GLSurfaceView和一个共享的EGL上下文。 (更新:注意this issue关于具有共享上下文的竞争条件。)
>“播放视频(TextureView)”和“TextureView中的基本GL”显示TextureView的动作。
>“使用FBO记录GL应用程序”使用一个简单的SurfaceView。

http://stackoverflow.com/questions/21305651/textureview-vs-glsurfaceview-or-how-to-use-glsurfaceview-with-egl14

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:android – TextureView与GLSurfaceView或如何使用GLSurfaceView与EGL14