当前位置: 首页 > backend >正文

SurfaceView、TextureView、SurfaceTexture 和 GLSurfaceView

在 Android 中,SurfaceViewTextureViewSurfaceTextureGLSurfaceView 是与图形渲染和视频播放密切相关的核心类,它们各自有不同的特性和适用场景。下面详细对比它们的区别和用途:


1. SurfaceView

特点

  • 独立的绘图表面SurfaceView 拥有独立的 Surface(由 SurfaceFlinger 直接管理),与主窗口分离,不依赖主线程 UI 渲染
  • 双缓冲机制:减少画面撕裂(Tearing)。
  • 高效渲染:适用于视频播放、相机预览、游戏等高性能场景。
  • 层级限制:由于是独立 Surface,可能会被其他视图遮挡(需通过 setZOrderOnTopsetZOrderMediaOverlay 调整层级)。

生命周期

  • Surface 的创建和销毁通过 SurfaceHolder.Callback 监听:
    surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) { /* Surface 可用 */ }@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { /* Surface 尺寸变化 */ }@Overridepublic void surfaceDestroyed(SurfaceHolder holder) { /* Surface 销毁 */ }
    });
    

适用场景

  • 视频播放(MediaPlayerExoPlayer
  • 相机预览(Camera2 API)
  • 高性能游戏(如 OpenGL ES 渲染)

2. TextureView

特点

  • 基于 SurfaceTexture:在 View 系统内渲染,支持动画、变换(平移、旋转、缩放)和透明度
  • 依赖主线程:通过 HardwareLayer 合成,性能略低于 SurfaceView
  • 无层级问题:作为普通 View,可以和其他视图自由叠加。

生命周期

  • 通过 SurfaceTextureListener 监听:
    textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { /* 可用 */ }@Overridepublic void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { /* 尺寸变化 */ }@Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { /* 销毁 */ return true; }@Overridepublic void onSurfaceTextureUpdated(SurfaceTexture surface) { /* 内容更新 */ }
    });
    

适用场景

  • 需要动态变换(如视频播放 + 动画)
  • 与其他视图混合渲染(如叠加 UI 控件)

3. SurfaceTexture

特点

  • 不直接显示:仅提供图像数据流(BufferQueue 的生产者端),需要配合 TextureViewSurfaceView 渲染。
  • 离屏渲染:从 CameraMediaCodec 等获取图像流,处理后输出到 Surface
  • 低延迟:适用于相机滤镜、视频帧处理等场景。

基本用法

// 创建 SurfaceTexture 并监听帧更新
SurfaceTexture surfaceTexture = new SurfaceTexture(textureId);
surfaceTexture.setOnFrameAvailableListener(surface -> { /* 新帧可用时回调 */ });// 将 SurfaceTexture 包装成 Surface,供相机/解码器使用
Surface surface = new Surface(surfaceTexture);
camera.setPreviewSurface(surface);

适用场景

  • 相机实时滤镜(如美颜)
  • 视频帧处理(如 OpenGL ES 后期处理)

4. GLSurfaceView

特点

  • 封装 OpenGL ES 渲染:继承自 SurfaceView,内置 EGL 管理、渲染线程和 GLSurfaceView.Renderer 接口。
  • 简化 OpenGL 开发:自动处理 Surface 生命周期和渲染循环。
  • 高性能图形:适用于 3D 图形、游戏、图像处理。

基本用法

glSurfaceView.setRenderer(new GLSurfaceView.Renderer() {@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) { /* OpenGL 初始化 */ }@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) { /* 视图尺寸变化 */ }@Overridepublic void onDrawFrame(GL10 gl) { /* 逐帧渲染 */ }
});
glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); // 连续渲染

适用场景

  • 3D 游戏(Unity/Unreal 底层)
  • 实时图像处理(如滤镜、特效)

对比总结

特性SurfaceViewTextureViewSurfaceTextureGLSurfaceView
渲染目标独立 Surface基于 View 系统离屏 BufferQueue独立 Surface + OpenGL
性能⭐⭐⭐⭐⭐(最高)⭐⭐⭐(依赖 UI 线程)⭐⭐⭐⭐(低延迟)⭐⭐⭐⭐⭐(GPU 加速)
动画/变换支持❌ 不支持✅ 支持❌ 需手动处理❌ 需 OpenGL 实现
层级问题可能被遮挡不直接显示类似 SurfaceView
适用场景视频/相机/游戏动态 UI + 视频帧处理/滤镜OpenGL ES 图形渲染

如何选择?

  1. 视频播放/相机预览SurfaceView(性能最优)。
  2. 视频 + UI 动画/变换TextureView
  3. 相机滤镜/帧处理SurfaceTexture + OpenGL ES
  4. 3D 图形/游戏GLSurfaceView(或直接使用游戏引擎)。

理解它们的差异,能帮助你在不同场景下选择最合适的组件!

http://www.xdnf.cn/news/15738.html

相关文章:

  • 【Android】ListView与RecyclerView的基础使用
  • 【unity游戏开发入门到精通——3D篇】3D光源之——unity使用Lens Flare (SRP) 组件实现太阳耀斑镜头光晕效果
  • C++实现单层时间轮
  • 4644电源管理芯片在微波射频组件中的技术优势与国产化实践
  • Linux驱动学习day24(UART子系统)
  • Ubuntu系统下快速体验iperf3工具(网络性能测试)
  • 嵌入式Linux:什么是线程?
  • 【RK3576】【Android14】开发环境搭建
  • Thread,ThreadLocal,ThreadLocalMap 三者的关系, 以及在实际开发中的应用【AI记录用】
  • 荷兰KIPP ZONEN CMP4 太阳辐射传感器耐热仪器设计高温日射计一种辐射计
  • 熔断和降*的区别
  • synchronized锁升级过程【AI笔记,仅供自己参考】
  • NIO网络通信基础
  • P1205 [USACO1.2] 方块转换 Transformations
  • 如何检查GitHub上可能潜在的信息泄漏
  • Vue3 Anime.js超级炫酷的网页动画库详解
  • NW983NW988美光固态闪存NW991NW992
  • 一个简单的带TTL的LRU的C++实现
  • 《通信原理》学习笔记——第四章
  • IDEA 中 Maven 配置:当前项目与新项目的统一设置方法
  • final 使用
  • oracle 11.2.0.4 RAC下执行root.sh脚本报错
  • leetcode2_135.分发糖果
  • ollma dify 搭建合同审查助手
  • 【Python】一些PEP提案(三):with 语句、yield from、虚拟环境
  • MySQL中的索引和事务
  • vue2 面试题及详细答案150道(81 - 90)
  • 解锁 Java 并发编程的奥秘:《Java 并发编程之美》中的技术亮点与难题攻克
  • FastAdmin后台登录地址变更原理与手动修改方法-后台入口机制原理解析-优雅草卓伊凡
  • 【计算机网络】MAC地址与IP地址:网络通信的双重身份标识