SurfaceView或TextureView组合

时间:2014-12-09 10:11:48

标签: android opengl-es surfaceview glsurfaceview textureview

我正在尝试将实时效果应用于相机预览并以多种视图显示,我该怎么办?
(就像camera2)(snapshot

如果左侧没有ScrollView,我知道有两种方法可以显示相机预设的实时效果。

  • 使用GLSurfaceView setRenderer。将SurfaceTexture绑定为GLES外部纹理,并使用GLSL(OpenGL着色语言)来应用效果。
  • 使用TextureView。它更复杂,因为需要设置EGLContext / EGLSurface并进行线程管理。

但是,我不知道如何使ScrollView与实时效果项叠加GLES组合。

  1. 我应该选择GLSurfaceView(用于性能)还是TextureView(用于flexble)来实现ScrollView ?哪一个是更好的解决方案,为什么?
  2. 是否可以在多个视图之间共享一个EGL上下文/表面?如果是,是否需要引用任何代码片段?
  3. 在Google搜索并阅读了不错的Graphics architecture文章和Grafika项目后,我仍然不知道...
    也许我想念一些重要的东西,有人指出我了吗?提前谢谢。

1 个答案:

答案 0 :(得分:6)

SurfaceView和滚动不能很好地结合在一起,因为SurfaceView有两个部分 - Surface和View - 一个的运动往往落后于另一个的运动。视图由应用程序渲染,但Surface由SurfaceFlinger合成,因此窗口移动必须通过窗口管理器传递。 TextureView没有这个问题,但确实引入了一些额外的开销。

如果你想在滚动时看起来很好看,你可能想要一个TextureView。

多个EGL上下文可以共享数据,并且可以使用单个EGL上下文呈现到多个表面。 Grafika有两个例子(" show + capture camera"使用GLSurfaceView和共享EGL上下文,"连续捕获"使用SurfaceView和单个EGL上下文;两个活动都呈现给屏幕表面和屏幕外表面。)

所有硬件加速的视图都有自己的EGL上下文管理,如果你要渲染到SurfaceView或TextureView上,没有理由搞乱它。

如果您计划实时绘制实时相机预览的多个版本,则可以通过在单个场景中自己渲染它们来获得最佳性能。渲染多个TextureView的效率会降低。根据您的UI选择,这可能意味着处理项目绘制和自己滚动而不是将其交给ListView。 (至少,您要确保您只是实时更新屏幕上实际显示的缩略图。)