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

Android中SurfaceView与GLSurfaceView 的关系

SurfaceView 与 GLSurfaceView 的关系

在 Android 开发中,SurfaceViewGLSurfaceView 是实现自定义渲染效果的关键组件。它们提供了不同的渲染方式,适用于不同的应用场景。我们将通过以下几个方面详细说明 SurfaceViewGLSurfaceView 的特点及实现原理,并结合 GLSurfaceView 的源码进行深入分析。

在这里插入图片描述

1. 概述

  • SurfaceView:提供一个独立的绘制表面 (Surface),用于在子线程中渲染图像。它适用于需要高频率更新画面的应用场景,如视频播放、相机预览等。

  • GLSurfaceView:继承自 SurfaceView,封装了 OpenGL 的渲染环境,为应用提供了更简便的 OpenGL 渲染接口。适用于图形密集的应用场景,如 3D 游戏或数据可视化。

2. SurfaceView 的实现与原理

2.1 工作原理

SurfaceView 的核心在于提供了一个独立的 Surface,即在独立于主线程的后台线程上绘制内容。SurfaceView 通过 SurfaceHolder 来管理 Surface 的生命周期,确保绘制与 UI 更新分离,提高渲染效率。

2.2 SurfaceHolder 机制

SurfaceView 使用 SurfaceHolder 管理 Surface 的创建、销毁和变化,主要方法包括:

  • SurfaceHolder.Callback:监听 Surface 的生命周期变化。
  • lockCanvas()unlockCanvasAndPost():锁定画布进行绘制,解锁画布并提交绘制结果。

2.3 示例代码

class MySurfaceView(context: Context) : SurfaceView(context), SurfaceHolder.Callback {init {holder.addCallback(this)}override fun surfaceCreated(holder: SurfaceHolder) {val canvas = holder.lockCanvas()// 在canvas上绘制holder.unlockCanvasAndPost(canvas)}override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {// Surface 改变时调用}override fun surfaceDestroyed(holder: SurfaceHolder) {// Surface 销毁时调用}
}

3. GLSurfaceView 的实现与源码解析

GLSurfaceViewSurfaceView 的子类,旨在为 OpenGL 渲染提供支持。GLSurfaceView 封装了 OpenGL 的初始化、渲染线程管理等,简化了开发流程。通过 GLSurfaceView,开发者可以更轻松地将 OpenGL 绘图代码与 Android 的渲染机制结合。

3.1 核心类分析

  • GLSurfaceView:提供了 GLSurfaceView.Renderer 接口,用于实现自定义的 OpenGL 渲染逻辑。主要方法包括 onSurfaceCreated()onDrawFrame()onSurfaceChanged()
  • GLThread:负责管理 OpenGL 的渲染线程。GLThread 保持 OpenGL 上下文,确保渲染工作在独立线程中完成,避免阻塞主线程。

3.2 GLSurfaceView 源码分析

GLSurfaceView 中,setRenderer() 会启动一个 GLThread 线程,调用开发者自定义的 Renderer 方法。GLThread 使用 OpenGL API 进行绘图,同时将绘制操作与 UI 线程分离。

public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback {// 1. 初始化渲染器public void setRenderer(Renderer renderer) {checkRenderThreadState();mRenderer = renderer;mGLThread = new GLThread(mThisWeakRef);mGLThread.start(); // 启动GLThread线程}// 2. GLThread:渲染线程private static class GLThread extends Thread {private WeakReference<GLSurfaceView> mGLSurfaceViewWeakRef;GLThread(WeakReference<GLSurfaceView> glSurfaceViewWeakRef) {mGLSurfaceViewWeakRef = glSurfaceViewWeakRef;}@Overridepublic void run() {// 渲染主循环while (true) {// 执行 OpenGL 绘制if (glSurfaceView.mRenderer != null) {glSurfaceView.mRenderer.onDrawFrame(gl);}}}}
}

3.3 Renderer 接口方法

  • onSurfaceCreated():在创建 OpenGL 表面时调用,用于初始化 OpenGL 环境。
  • onSurfaceChanged():当视图大小或形状改变时调用,用于适应新的显示区域。
  • onDrawFrame():在每一帧绘制时调用,实际的绘图逻辑写在此方法中。
class MyGLRenderer : GLSurfaceView.Renderer {override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {// 初始化OpenGL相关资源}override fun onDrawFrame(gl: GL10?) {// 绘制每一帧}override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {// 更新视图大小GLES20.glViewport(0, 0, width, height)}
}

在这里插入图片描述

4. SurfaceView 与 GLSurfaceView 的区别

特性SurfaceViewGLSurfaceView
渲染技术CanvasOpenGL
渲染线程可在自定义线程中渲染自动管理 OpenGL 渲染线程
应用场景视频播放、相机预览3D 游戏、图形密集的应用
渲染接口lockCanvas()unlockCanvasAndPost()Renderer 接口,提供 onDrawFrame() 等方法

5. 总结

SurfaceViewGLSurfaceView 是 Android 中用于自定义渲染的重要组件,适用于不同的应用场景。SurfaceView 提供了在独立线程上绘制内容的机制,而 GLSurfaceView 则为 OpenGL 渲染进行了更高层次的封装,使得图形密集型应用的开发更加便捷。

在实际开发中,选择 SurfaceView 还是 GLSurfaceView 主要取决于渲染需求,如果应用需要大量的 3D 图形渲染或频繁更新的图像内容,GLSurfaceView 是更优选择。

参考

http://labs.beatcraft.com/ja/index.php?Android%20%A4%C7%20OpenGL%20ES%20%20%A4%F2%BB%C8%CD%D1%A4%B9%A4%EB

相关文章:

Android中SurfaceView与GLSurfaceView 的关系

SurfaceView 与 GLSurfaceView 的关系 在 Android 开发中&#xff0c;SurfaceView 和 GLSurfaceView 是实现自定义渲染效果的关键组件。它们提供了不同的渲染方式&#xff0c;适用于不同的应用场景。我们将通过以下几个方面详细说明 SurfaceView 和 GLSurfaceView 的特点及实现…...

numpy——数学运算

一、标量——矢量 import numpy as npa 3.14 b np.array([[9, 5], [2, 7]])print(a) print(b)# ---------- 四则运算 ---------- print(a b) # np.add print(a - b) # np.subtract print(a * b) # np.multiply print(a / b) # np.divide 二、矢量——矢量 import nump…...

【工具】Charles对360浏览器抓包抓包

Charles 和 switchy sharp 配合&#xff0c;可以对 Chrome 进行抓包也可以配合对360安全浏览器抓包。 本文以Windows 电脑中的配置为例&#xff0c;介绍如何实现抓包。&#xff08;Mac中操作基本一致&#xff09; 1.安装Charles 可根据自己的电脑下载对应的版本&#xff1a;…...

【HarmonyOS】判断应用是否已安装

【HarmonyOS】判断应用是否已安装 前言 在鸿蒙中判断应用是否已安全&#xff0c;只是通过包名是无法判断应用安装与否。在鸿蒙里新增了一种判断应用安装的工具方法&#xff0c;即&#xff1a;canOpenLink。 使用该工具函数的前提是&#xff0c;本应用配置了查询标签querySch…...

Qt Designer客户端安装和插件集(pyqt5和pyside2)

GitHub - PyQt5/QtDesignerPlugins: Qt Designer PluginsQt Designer Plugins. Contribute to PyQt5/QtDesignerPlugins development by creating an account on GitHub.https://github.com/PyQt5/QtDesignerPlugins 一、下载客户端 https://github.com/PyQt5/QtDesigner/rel…...

基于边缘计算的智能门禁系统架构设计分析

案例 阅读以下关于 Web 系统架构设计的叙述&#xff0c;回答问题1至问题3。 【说明】 某公司拟开发一套基于边缘计算的智能门禁系统&#xff0c;用于如园区、新零售、工业现场等存在来访被访业务的场景。来访者在来访前&#xff0c;可以通过线上提前预约的方式将自己的个人信息…...

鸿蒙实现相机拍照及相册选择照片

前言&#xff1a; 1.如果你的应用不是存储类型或者相机拍照类型&#xff0c;你就需要用 kit.CameraKit Api 实现相机拍照和相册选择照片功能&#xff0c;如果你不用这个的话&#xff0c;你使用 picker.PhotoViewPicker &#xff0c;你就需要申请权限&#xff0c;那你提交应用审…...

「C/C++」C++17 之 std::filesystem::recursive_directory_iterator 目录及子目录迭代器

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

智能EDA小白从0开始 —— DAY30 冉谱微RFIC-GPT

在科技日新月异的今天&#xff0c;电子设计自动化&#xff08;EDA&#xff09;行业正以前所未有的速度推动着半导体产业的革新与发展&#xff0c;引领着全球电子产业迈向更加智能化、高效化的未来。作为EDA领域的佼佼者&#xff0c;冉谱公司始终站在技术创新的前沿&#xff0c;…...

Android -- 调用系统相册之图片裁剪保存

前言 最近线上反馈&#xff0c;部分vivo手机更换头像时调用系统相册保存图片失败&#xff0c;经本人测试&#xff0c;确实有问题。 经修复后&#xff0c;贴出这块的代码供小伙伴们参考使用。 功能 更换头像选择图片&#xff1a; 调用系统相机拍照&#xff0c;调用系统图片…...

读《道德经》让人感到心胸气闷?董仲舒篡改

为什么读《道德经》会让人感到心胸气闷&#xff1f;难道是董仲舒篡改所致&#xff1f; 作为世界智慧源头的《老子》&#xff0c;享誉古今中外&#xff0c;是世界历史上最伟大的著作之一。 然而&#xff0c;很多人读《道德经》时会感到心胸气闷&#xff0c;这究竟是为什么呢&am…...

D52【python 接口自动化学习】- python基础之模块与标准库

day52 标准库 学习日期&#xff1a;20241029 学习目标&#xff1a;模块与标准库 -- 67 标准库&#xff1a;Python默认提供的便携功能有哪些&#xff1f; 学习笔记 标准库中的常见组件 如何通过官方文档学习标准 from urllib.request import urlopen with urlopen(http://ww…...

基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的布匹缺陷检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的布匹缺陷检测系统是在 PyTo…...

SQL Server 中,将单行数据转换为多行数据

在 SQL Server 中&#xff0c;将单行数据转换为多行数据通常涉及到将某个字段中的逗号分隔的值拆分成多行。这种操作通常称为“拆分”或“展开”&#xff08;Explode&#xff09;。以下是一些常用的方法来实现这一目标&#xff1a; 1. 使用内置函数 STRING_SPLIT 从 SQL Serv…...

解决数组两数之和问题与逻辑推理找出谋杀案凶手

给定一个整数数组nums和一个整数目标值target(2<nums.length<10^4)&#xff0c;请你在该数组中找出和为目标值target 的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返…...

uniapp的IOS证书申请(测试和正式环境)及UDID配置流程

1.说明 本教程只提供uniapp在ios端的证书文件申请&#xff08;包含正式环境和开发环境&#xff09;、UDID配置说明&#xff0c;请勿用文档中的账号和其他隐私数据进行测试&#xff0c;请勿侵权&#xff01; 2.申请前准备 证书生成网站&#xff1a;苹果应用上传、解析&#x…...

windows 安装apex_Nvidia Apex安装

参见windows 安装apex_Nvidia Apex安装 重点&#xff1a; 1、在安装前先检查一下&#xff0c;电脑的cuda版本和pytorch内的cuda版本是否一样&#xff0c;不一样的话就把低版本的进行升级&#xff1b; $ git clone https://github.com/NVIDIA/apex$ cd apex2、在保证cuda版本一…...

Laravel5 抓取第三方网站图片,存储到本地

背景 近期发现&#xff0c;网站上的部分图片无法显示&#xff0c; 分析发现&#xff0c;是因为引用的第三方网站图片&#xff08;第三方服务器证书已过期&#xff09; 想着以后显示的方便 直接抓取第三方服务器图片&#xff0c;转存到本地服务器 思路 1. 查询数据表&#xff0…...

DevOps和CI/CD以及在微服务架构中的作用

DevOps 和 CI/CD 是现代软件开发和运维中两个重要的概念,它们之间有紧密的联系,但也有不同的侧重点。以下是对这两个概念的详细介绍和比较。 1. DevOps 定义: DevOps 是一种文化、运动和实践,旨在通过促进开发(Development)和运维(Operations)团队之间的协作,提升软…...

Rust 力扣 - 5. 最长回文子串

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 从中心点先寻找和中心点相等的左右端点&#xff0c;在基于左右端点进行往外扩散&#xff0c;直至左右端点不相等或者越界&#xff0c;然后左右端点这个范围内就是我们找寻的回文串&#xff0c;我们遍历中心点&am…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...