android - SurfaceView 或 TextureView 组合

标签 android opengl-es surfaceview glsurfaceview textureview

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

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

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

但是,我不知道如何让带有实时效果项的ScrollView叠加GLES合成。

  1. 我应该选择 GLSurfaceView(为了性能)还是 TextureView(为了灵活)来实现 ScrollView?哪一个是更好的解决方案,为什么?
  2. 是否可以在多个 View 之间共享一个 EGL 上下文/表面?如果可以,是否可以引用任何代码 fragment ?

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

最佳答案

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

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

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

所有硬件加速的 View 都有自己的 EGL 上下文管理,如果您要渲染到 SurfaceView 或 TextureView,则没有理由打扰它。

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

关于android - SurfaceView 或 TextureView 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27376340/

相关文章:

java - Android Canvas渲染

android - 如何在可通过 USB 访问的外部存储中创建文件/文件夹?

android - Android OpenGL 多重采样/抗锯齿问题

java - 同步Android表面 View

java - 无法更改 Android Activity

java - 如何构建简单的 Android 应用程序

android - 无法在 android studio 的屏幕上显示和保存捕获的图像

java - 想要删除 firebaseddatabase 中的特定节点(硬拉)

android - 如何使 Android TV 可以搜索应用内容

java - Android/OpenGLES : Pulling x and y coords through my class hierarchy?