SurfaceView和TextureView对比

SurfaceView及TextureView对比

SurfaceView是什么?

它继承自类View,因此它本质上是一个View。但与普通View不同的是,它有自己的Surface。有自己的Surface,在WMS中有对应的WindowState,在SurfaceFlinger中有Layer。我们知道,一般的Activity包含的多个View会组成View hierachy的树形结构,只有最顶层的DecorView,也就是根结点视图,才是对WMS可见的。这个DecorView在WMS中有一个对应的WindowState。相应地,在SF中对应的Layer。而SurfaceView自带一个Surface,这个Surface在WMS中有自己对应的WindowState,在SF中也会有自己的Layer。虽然在App端它仍在View hierachy中,但在Server端(WMS和SF)中,它与宿主窗口是分离的。

SurfaceView结构

SurfaceView这样设计的优势和缺陷是什么?

优势

这样的好处是对这个Surface的渲染可以放到单独线程去做,渲染时可以有自己的GL context。这对于一些游戏、视频等性能相关的应用非常有益,因为它不会影响主线程对事件的响应。

缺点

因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中,一些View中的特性也无法使用。

SurfaceView双缓冲是什么?

通俗来讲就是有两个缓冲区,一个后台缓冲区和一个前台缓冲区,每次后台缓冲区接受数据,当填充完整后交换给前台缓冲,这样就保证了前台缓冲里的数据都是完整的。

双缓冲:SurfaceView在更新视图时用到了两张Canvas:

  1. frontCanvas:实际显示的canvas
  2. backCanvas:存储的是上一次更改前的canvas

流程如下:

双缓冲流程

好处是什么?

  1. 提高渲染效率
  2. 可以避免刷新频率过高而出现的闪烁现象

TextureView是什么?

在Android4.0(API level 14)中引入,与SurfaceView一样继承View,它可以将内容流直接投影到View中,它可以将内容流直接投影到View中,可以用于实现Live preview等功能。

  1. 和SurfaceView不同,不在WMS中单独创建窗口,而是作为View hierachy中的一个普通view,因此可以合其他普通View一样进行移动,旋转,缩放,动画等变化。
  2. 和SurfaceView不同,TextureView必须在硬件加速的窗口中。
  3. 它显示的内容流数据可以来自App进程或是远端进程。
  4. TextureView继承自View,它与其它的View一样在View hierachy中管理与绘制。TextureView重载了draw()方法,其中主要SurfaceTexture中收到的图像数据作为纹理更新到对应的HardwareLayer中。

TextureView优点和缺点?

优点:支持移动、旋转、缩放等动画,支持截图
缺点:必须在硬件加速的窗口中使用,占用内存比SurfaceView高,在5.0以前在主线程渲染,5.0以后有单独的渲染线程。

TextureView和SurfaceView区别是什么?

区别

播放器应该选哪个?

从性能和安全性角度出发,优先选SurfaceView

  1. 在android 7.0上系统surfaceview的性能比TextureView更有优势,支持对象的内容位置和包含的应用内容同步更新,平移、缩放不会产生黑边。 在7.0以下系统如果使用场景有动画效果,可以选择性使用TextureView
  2. 由于失效(invalidation)和缓冲的特性,TextureView增加了额外1~3帧的延迟显示画面更新
  3. TextureView总是使用GL合成,而SurfaceView可以使用硬件overlay后端,可以占用更少的内存带宽,消耗更少的能量
  4. TextureView的内部缓冲队列导致比SurfaceView使用更多的内存
  5. SurfaceView: 内部自己持有surface,surface 创建、销毁、大小改变时系统来处理的,通过surfaceHolder 的callback回调通知。当画布创建好时,可以将surface绑定到MediaPlayer中。SurfaceView如果为用户可见的时候,创建SurfaceView的SurfaceHolder用于显示视频流解析的帧图片,如果发现SurfaceView变为用户不可见的时候,则立即销毁SurfaceView的SurfaceHolder,以达到节约系统资源的目的