SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 详解

Kitty ·
更新时间:2024-09-20
· 668 次阅读

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纹理等操作
原创文章 15获赞 21访问量 2361 关注 私信 展开阅读全文
作者:Arvin_FM



glsurfaceview textureview surfaceview

需要 登录 后方可回复, 如果你还没有账号请 注册新账号