2

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

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

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

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

  1. 我应该选择 GLSurfaceView (用于性能)还是 TextureView (用于灵活)来实现 ScrollView?哪一个是更好的解决方案,为什么?
  2. 是否可以在多个视图之间共享一个 EGL 上下文/表面?如果是的话,有什么代码片段可以参考吗?

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

4

1 回答 1

6

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

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

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

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

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

于 2014-12-09T17:32:09.257 回答