SurfaceView、TextureView、GLSurfaceView 和 SurfaceTexture

SurfaceView


SurfaceView 是一个能够在子线程中更新 UI 的 View,且不会影响到主线程微信


它为本身建立了一个窗口(window),就好像在视图层次(View Hierarchy)上穿了个“洞”,让绘图层(Surface)直接显示出来。app


可是,和常规视图(view)不一样,它没有动画或者变形特效,一些 View 的特性也没法使用。编辑器


归纳:学习

  • SurfaceView 独立于视图层次(View Hierarchy),拥有本身的绘图层(Surface),但也没有一些常规视图(View)的特性,如动画等。flex

  • SurfaceView 的实现中具备两个绘图层(Surface),即咱们所说的双缓冲机制。咱们的绘制发生在后台画布上,并经过交换先后台画布来刷新画面,可避免局部刷新带来的闪烁,也提升了渲染效率。动画

  • SurfaceView 中的 SurfaceHolder 是 Surface 的持有者和管理控制者。google

  • SurfaceHolder.Callback 的各个回调发生在主线程。url


GLSurfaceView


GLSurfaceView 继承 SurfaceView,除了拥有 SurfaceView 全部特性外,还加入了 EGL(EGL 是 OpenGL ES 和原生窗口系统之间的桥梁) 的管理,并自带了一个单独的渲染线程。spa


归纳:.net

  • 继承自 SurfaceView,拥有其全部特性。

  • 加入了 EGL 管理,是 SurfaceView 应用 OpenGL ES 的典型场景。

  • 有单独的渲染线程 GLThread。

  • 单独出了 Renderer 接口负责实际渲染,不一样的 Renderer 实现至关于不一样的渲染策略,使用方式灵活(策略模式)。


SurfaceTexture


Android 3.0(API 11)新加入的一个类,不一样于 SurfaceView 会将图像显示在屏幕上,SurfaceTexture 对图像流的处理并不直接显示,而是转为 GL 外部纹理


归纳:

  • SurfaceTexture 能够从图像流(相机、视频)中捕获帧数据用做 OpenGL ES 外部纹理(GL_TEXTURE_EXTERNAL_OES),实现无缝链接

  • 咱们能够很方便的对这个外部纹理进行二次处理(如添加滤镜等)。

  • 输出目标是 Camera 或 MediaPlayer 时,能够用 SurfaceTexture 代替 SurfaceHolder,这样图像流将把全部帧传给 SurfaceTexture 而不是显示在设备上。

  • 使用 updateTexImage() 方法更新最新的图像。


TextureView


TextureView 是 Android 4.0(API 14)引入,它必须使用在开启了硬件加速的窗体中。


除了拥有 SurfaceView 的特性外,它还能够进行像常规视图(View)那样进行平移、缩放等动画


归纳:

  • 必须开启硬件加速(这个默认就是开启的)。

  • 能够像常规视图(View)那样使用它,包括进行平移、缩放等操做

  • TextureView 重载了 draw() 方法,主要是使用 SurfaceTexture 中收到的图像数据做为纹理更新到对应的 HardwareLayer 中。

  • 经过 SurfaceTextureListener 接口让使用者知道 SurfaceTexture 的各类状态。


SurfaceView 对比 TextureView



SurfaceView TextureView
内存 较低 较高
绘制 及时 1-3 帧延迟
耗电 较低 较高
动画和截图 不支持 支持


本文连接:https://blog.csdn.net/afei__/article/details/100023701

做者:阿飞__


-- END --


进技术交流群,扫码添加个人微信:Byte-Flow



获取视频教程和源码



推荐:

Android OpenGL 渲染图像读取哪家强?

字节流动 OpenGL ES 技术交流群来啦

FFmpeg + OpenGL ES 实现 3D 全景播放器

FFmpeg + OpenGLES 实现视频解码播放和视频滤镜

一文掌握 YUV 图像的基本处理

Android OpenGL ES 从入门到精通系统性学习教程

OpenGL ES 实现动态(水波纹)涟漪效果


以为不错,点个在看呗~

本文分享自微信公众号 - 字节流动(google_developer)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。