关键字 View

  • SurfaceView
  • GLSurfaceView
  • TextureView

这三个后缀都是View, 所以这三个东西都是用来显示的, 和普通的View差不多, 类似TextView等。

发展历史:

SurfaceView 出现最早, 解决类似视频播放的问题(可以用单独一个线程来渲染UI)。后来发现用起来不方便, 渲染线程需要单独编写, 一大堆都可以独立成模板。

所以就出现了 GLSurfaceView, 概括一句话就是:使用了模板的 SurfaceView

再后来发现GLSurfaceView不能根据屏幕的变化而变化, 这是由于GLSurfaceView同应用的Surface不是在同一层导致的问题。

人们就想到把这个GLSurfaceView弄到应用的Surface中, 所以就产生了TextureView。

关键字 Texture

  • SurfaceTexture

它不是用来显示给用户看的, 而是一个Texture, 意思是纹理,可以想象成一个View的中间件。

举个例子:

  1. Camera 把视频采集的内容交给 SurfaceView, 就变成了照相机。
  2. Camera 把视频采集的内容交给 SurfaceTexture, SurfaceTexture 在对内容做个美颜, 然后SurfaceTexture 再把内容交给 SurfaceView, 就变成了美图秀秀。

详细点说:

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

  • 渲染线程的工作

TextureView

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

SurfaceTexture

可进行图像流数据二次处理(如Camera滤镜,桌面特效等)。

和SurfaceView不同的是,它对图像流的处理并不直接显示,而是转为GL外部纹理,比如Camera的预览数据,变成纹理后可以交给GLSurfaceView直接显示,也可以通过SurfaceTexture交给TextureView作为View heirachy中的一个硬件加速层来显示。

 

Logo

鸿蒙生态一站式服务平台。

更多推荐