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

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.dtcms.com/a/287507.html

相关文章:

  • 立创EDA中双层PCB叠层分析
  • 原码、反码和补码在计算机中的运算规则有何不同?
  • 医疗AI与融合数据库的整合:挑战、架构与未来展望(上)
  • 小谈相机的学习过程
  • 软考 系统架构设计师系列知识点之杂项集萃(112)
  • jvm-sandbox-repeater 录制和回放
  • 基于深度学习的微表情识别算法研究
  • 智慧园区工程监控与工单管理系统需求文档
  • Go语言里的map
  • RocketMQ源码级实现原理-NameServer路由机制
  • 解锁C++性能密码:TCMalloc深度剖析
  • 低代码平台ToolJet实战总结
  • Java学习--------消息队列的重复消费、消失与顺序性的深度解析​
  • n8n教程分享,从Github读取.md文档内容
  • Redisson RLocalCachedMap 核心参详解
  • Astro:前端性能革命!从原生 HTML 到 Astro + React 的升级指南
  • Flutter基础(前端教程①⑤-API请求转化为模型列成列表展示实战)
  • 前端面试专栏-工程化:28.团队协作与版本控制(Git)
  • 运用KANO模型分析扫地机器人用户需求
  • LangGraph教程9:LangGraph检查点和Send机制
  • Linux 基础命令:文件和目录操作、文件内容查看、进程管理
  • 【嵌入式电机控制#16】电流环(三):过采样提高采集精度看门狗监测总线电压
  • Nginx 实战 :使用logrotate实现日志轮转与保留策略!
  • 【数据结构】二叉树初阶详解(一):树与二叉树基础 + 堆结构全解析
  • 2025 Data Whale x PyTorch 安装学习笔记(Windows 版)
  • Kotlin方差
  • 403 Forbidden:无权限访问请求的资源如何处理
  • Apache Kafka 学习笔记
  • FreeRTOS—列表和列表项
  • Kafka、RabbitMQ 与 RocketMQ 高可靠消息保障方案对比分析