我正在开发使用相机的Android应用程序。为了显示相机预览,我观察了许多使用表面视图或纹理视图的示例。 为什么这些优于使用ImageView显示相机预览?我使用Imageview显示预览,它工作正常。
感谢。
答案 0 :(得分:4)
请不要使用ImageView。这是非常低效的,如果你能用这种方法产生高分辨率预览(1080p),我会感到惊讶。
SurfaceView和TextureView分别直接将零拷贝缓冲区从摄像机驱动程序推送到硬件编写器或GPU。除了需要在目的地进行的最终转换之外,没有额外的缓冲区副本或转换。这大大减少了内存带宽和CPU开销。
创建位图很慢,占用大量CPU,并且每个帧都有几个副本,也浪费了内存。
答案 1 :(得分:1)
为什么这些比使用ImageView显示相机预览更受欢迎?
效率,可能还有其他原因。
使用SurfaceView
和TextureView
,基础相机引擎可以通过GPU和OpenGL引擎更直接地与输出表面一起工作,绕过Dalvik / ART运行时。在您的情况下,您强制相机引擎填写Java byte[]
,然后您将其解码为Bitmap
,然后通过ImageView
更新UI。如果你使用表面,这将是一个额外的CPU处理和内存繁忙。