-
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的所有项目运行需要的数据结构。如顶点、片段着色器、顶点数据矩阵。
-
创建绘图窗口
-
管理EGL环境
-
OpenGL渲染一般流程
线程创建-获取显示设备-初始化egl-选择配置-创建上下文-渲染-销毁上下文-线程销毁 -
GLThread
渲染线程的工作
-
EglHelper作用(GLSurfaceView已经包含了EGL,已经帮我们做了)
-
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必须在硬件加速的窗口中。