SurfaceView、GLSurfaceView、SurfaceTexture、TextureView简单对比
关键字 ViewSurfaceViewGLSurfaceViewTextureView这三个后缀都是View, 所以这三个东西都是用来显示的, 和普通的View差不多, 类似TextView等。发展历史:SurfaceView 出现最早, 解决类似视频播放的问题(可以用单独一个线程来渲染UI)。后来发现用起来不方便, 渲染线程需要单独编写, 一大堆都可以独立成模板。所以就出现了 GLSurface
关键字 View
- SurfaceView
- GLSurfaceView
- TextureView
这三个后缀都是View, 所以这三个东西都是用来显示的, 和普通的View差不多, 类似TextView等。
发展历史:
SurfaceView 出现最早, 解决类似视频播放的问题(可以用单独一个线程来渲染UI)。后来发现用起来不方便, 渲染线程需要单独编写, 一大堆都可以独立成模板。
所以就出现了 GLSurfaceView, 概括一句话就是:使用了模板的 SurfaceView。
再后来发现GLSurfaceView不能根据屏幕的变化而变化, 这是由于GLSurfaceView同应用的Surface不是在同一层导致的问题。
人们就想到把这个GLSurfaceView弄到应用的Surface中, 所以就产生了TextureView。
关键字 Texture
- SurfaceTexture
它不是用来显示给用户看的, 而是一个Texture, 意思是纹理,可以想象成一个View的中间件。
举个例子:
- Camera 把视频采集的内容交给 SurfaceView, 就变成了照相机。
- 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中的一个硬件加速层来显示。
更多推荐
所有评论(0)