【问题标题】:SurfaceView or TextureView combinationSurfaceView 或 TextureView 组合
【发布时间】:2015-02-07 04:35:42
【问题描述】:

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

如果左侧不涉及 ScrollView,我知道有 2 种方法可以在相机预览上显示实时效果。

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

但是,我不知道如何使带有实时效果项的 ScrollView 覆盖 GLES 组合。

  1. 应该选择GLSurfaceView(性能)还是TextureView(flexble)来实现ScrollView?哪一个是更好的解决方案?为什么?
  2. 是否可以在多个视图之间共享一个 EGL 上下文/表面?如果可以,是否可以参考任何代码 sn-ps?

在谷歌搜索和阅读不错的Graphics architecture 文章和Grafika 项目之后,我仍然不知道...
也许我错过了一些重要的事情,有人指出我吗?提前致谢。

【问题讨论】:

    标签: android opengl-es surfaceview glsurfaceview textureview


    【解决方案1】:

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

    如果您希望它在滚动时看起来不错,您可能需要一个 TextureView。

    多个 EGL 上下文可以共享数据,并且可以使用单个 EGL 上下文渲染到多个表面。 Grafika 有这两者的例子(“显示 + 捕获相机”使用 GLSurfaceView 和共享 EGL 上下文,“连续捕获”使用 SurfaceView 和单个 EGL 上下文;两个活动都呈现到屏幕表面和屏幕外表面) .

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

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

    【讨论】:

    • 那么,如果我后面已经用过GlSurfaceView,那我最好还是选择TextureView呢? 为 TextureView 表面创建第二个 EGL 上下文并与 GLSurfaceView 上下文共享状态? 然后,不用多个 TextureView,只需 在 ScrollView 内的一个 TextureView 上使用 GLES 渲染多个四边形? 请如果我错了,请纠正我,谢谢。
    • 另一个想法。为了更好的性能和对渲染过程的更多控制,是否可以使用 2 个 SurfaceView 来实现这一点? (然后我可以使用单个 EGL 上下文来渲染 2 个表面,就像“显示 + 捕获相机”一样)。
    • 如果你想使用 GLSurfaceView,而不是普通的 SurfaceView,你就会被多个 EGL 上下文共享状态所困。如果背面使用普通的 SurfaceView,则可以使用单个 EGL 上下文。 TextureView + ScrollView 似乎是合理的,虽然我自己没有尝试过。如果您将 Z 排序设置为一个在另一个之前的位置,则可以使用两个 SurfaceView,但如果 SurfaceFlinger 合成的表面数量超过覆盖平面计数,您可能会受到性能影响。 (参见 Grafika “多表面”活动。)
    • 如果我在这种情况下使用 2 个 SurfaceViews,是否有可能超出 Android 4.4 设备上的覆盖平面?我的意思是 kitkat 设备通常支持 4 个覆盖平面,并且摄像头是全屏的(没有状态栏,带有虚拟导航栏),因此 Hardware Composer 状态将为“SurfaceView、SurfaceView、xxxActivity、NavigationBar”从后到前排序。看起来刚好符合要求。
    • 我认为您将不得不进行一些实验。 Grafika 中的“显示 + 捕捉相机”活动被重写了大约五次,而我试图弄清楚如何将不同的部分组合在一起。您可以使用单个 EGL 上下文渲染到 SurfaceView 和 TextureView; “内置”到 TextureView 的 EGL 上下文用于渲染您在其 Surface 上绘制的内容。 (请参阅“TextureView 中的简单 GL”活动中 Renderer#run() 中的 EGL 设置;您可以使用预先存在的 EGLCore。)
    猜你喜欢
    • 2014-04-23
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    相关资源
    最近更新 更多