SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 详解

  • SurfaceView
    它继承自类View,因此它本质上是一个View。但与普通View不同的是,它有自己的Surface(用来保存像素数据的保留内存区域)。

    • 优点
      它与宿主窗口是分离的。这样的好处是对这个Surface的渲染可以放到单独线程去做,渲染时可以有自己的GLContext,它不会影响主线程对事件的响应。
    • 缺点
      因为这个Surface不在View hierachy中,它的显示也不受View的属性控制,所以不能进行平移,缩放等变换,也不能放在其它ViewGroup中,一些View中的特性也无法使用。
  • GLSurfaceView
    在SurfaceView的基础上,它加入了EGL的管理,并自带了渲染线程。另外它定义了用户需要实现的Render接口,提供了用Strategy pattern更改具体Render行为的灵活性。作为GLSurfaceView的Client,只需要将实现了渲染函数的Renderer的实现类设置给GLSurfaceView即可。

    • EglHelper作用(GLSurfaceView已经包含了EGL,已经帮我们做了)
      • 管理EGL环境
        EGL既然做平台和OpenGL ES的中间件那EGL做的就肯定是和平台息息相关的事:
        • 创建绘图窗口
          也就是所谓的FrameBuffer,FrameBuffer可以显示到屏幕上(SurfaceView)
        • 创建渲染环境(Context上下文)
          渲染环境指OpenGL ES的所有项目运行需要的数据结构。如顶点、片段着色器、顶点数据矩阵。
    • OpenGL渲染一般流程
      线程创建-获取显示设备-初始化egl-选择配置-创建上下文-渲染-销毁上下文-线程销毁
    • GLThread
      渲染线程的工作
  • SurfaceTexture
    可进行图像流数据二次处理(如Camera滤镜,桌面特效等)
    和SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,比如Camera的预览数据,变成纹理后可以交给GLSurfaceView直接显示,也可以通过SurfaceTexture交给TextureView作为View heirachy中的一个硬件加速层来显示。

    • 流程
      SurfaceTexture从图像流(来自Camera预览,视频解码,GL绘制场景等)中获得帧数据
      调用updateTexImage()时,根据内容流中最近的图像更新SurfaceTexture对应的GL纹理对象
      像操作普通GL纹理一样操作它
      Surface是生产者端的实现类,提供dequeueBuffer/queueBuffer等硬件渲染接口,和lockCanvas/unlockCanvasAndPost等软件渲染接口,使内容流的源可以往BufferQueue中填graphic buffer。GLConsumer继承自ConsumerBase,是消费者端的实现类。它在基类的基础上添加了GL相关的操作,如将graphic buffer中的内容转为GL纹理等操作
      在这里插入图片描述

(video camera software/hardware renderer)->(BufferQueue(surface))->(buffterQueue Consumer(GLConsumer))->(surfaceView textureview others)

  • TextureView 它可以将内容流直接投影到View中,可以用于实现Live preview等功能。和SurfaceView不同,它不会在WMS中单独创建窗口,而是作为View hierachy中的一个普通View,因此可以和其它普通View一样进行移动,旋转,缩放,动画等变化。值得注意的是TextureView必须在硬件加速的窗口中。