哪个视图是 android 相机预览的最佳选择?

Which View is best choice for android camera preview?

我们知道,我们可以选择TextureViewSurfaceViewGLSurfaceView for android 相机预览。

哪个是相机预览的最佳选择?我专注于相机性能。

" SurfaceView 在 Android 窗口系统中创建了一个新的 window。它的优点是,如果 SurfaceView 被刷新,只有这个 window 会被刷新。如果你另外更新 UI 元素(在 window 系统的另一个 window 中),然后两个刷新操作都会阻塞它们自己(特别是当 ui 绘图是硬件支持的时候),因为 opengl 无法处理多正确画线。

对于这种情况,最好使用 TextureView,因为它不是 Android 窗口系统的另一个 window。因此,如果您刷新视图,所有 UI 元素也会刷新。 (可能)所有内容都在一个线程中。

希望我能帮到你们中的一些人! “ 资料来源:whosebug.com

GLSurfaceView 是一个带有包装器的 SurfaceView class,它可以为您完成所有 EGL 设置和线程间消息传递。

使用什么完全取决于您。他们各有利弊 :)

从性能的角度来看,SurfaceView 是赢家。

使用 SurfaceView,帧来自相机并被转发到系统图形合成器 (SurfaceFlinger),无需复制。在大多数情况下,任何缩放都将由显示处理器而不是 GPU 完成,这意味着不是扫描像素一次进行缩放然后再次扫描输出,而是只扫描一次。

GLSurfaceView 是一个带有一些包装器 类 的 SurfaceView,用于处理 EGL 设置和线程管理。你不能在接收相机帧的 Surface 上使用 OpenGL ES,所以你在做额外的工作而没有任何好处。 (开销是次要的一次性设置,而不是每帧,因此您可能无法衡量差异。)

TextureView 接收 SurfaceTexture 中的帧作为 "external" OpenGL ES 纹理,然后使用 GLES 将它们渲染到应用程序的 UI 表面上。缩放和渲染由 GPU 执行,然后将结果转发给 SurfaceFlinger。这是最慢的选项,但也是最灵活的视图。

如果您想了解有关系统工作原理的更多信息,请参阅 Android Graphics Architecture document