众所周知,我们可以选择TextureView,SurfaceView和GLSurfaceView进行android相机预览。
哪一个是相机预览的最佳选择?我专注于相机性能。
众所周知,我们可以选择TextureView,SurfaceView和GLSurfaceView进行android相机预览。
哪一个是相机预览的最佳选择?我专注于相机性能。
从性能的角度来看,SurfaceView 是赢家。
使用 SurfaceView,帧来自相机并被转发到系统图形合成器(SurfaceFlinger),无需复制。在大多数情况下,任何缩放都将由显示处理器而不是 GPU 完成,这意味着不是扫描像素一次进行缩放,然后再次扫描输出,它们只扫描一次。
GLSurfaceView 是一个带有一些处理 EGL 设置和线程管理的包装类的 SurfaceView。您不能在接收相机帧的 Surface 上使用 OpenGL ES,因此您正在做额外的工作而没有任何好处。(开销是较小的一次性设置,而不是每帧,因此您可能无法测量差异。)
TextureView 接收 SurfaceTexture 中的帧作为“外部”OpenGL ES 纹理,然后使用 GLES 将它们渲染到应用程序的 UI 表面上。缩放和渲染由 GPU 执行,然后将结果转发给 SurfaceFlinger。这是最慢的选项,但也是视图中最灵活的选项。
如果您想了解有关系统工作原理的更多信息,请参阅Android 图形架构文档。
" SurfaceView 在 Android Windowsystem 中创建一个新窗口。它的优点是,如果 SurfaceView 被刷新,只有这个窗口会被刷新。如果你额外更新 UI 元素(它们在窗口系统的另一个窗口中),那么两者都刷新由于opengl无法正确处理多线程绘图,因此操作会阻止自己(尤其是在硬件支持ui绘图时)。
对于这种情况,最好使用 TextureView,因为它不是 Android Windowsystem 的另一个窗口。所以如果你刷新你的视图,所有的 UI 元素也会被刷新。(可能)一个线程中的所有内容。
希望我能帮助你们中的一些人!” 来源:stackoverflow.com
GLSurfaceView 是一个带有包装类的 SurfaceView,它为您完成所有 EGL 设置和线程间消息传递。
使用什么完全取决于您.. 他们各有利弊:)