当前位置: 首页 > 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…...

DDOS防护介绍

DDoS攻击的基本概念 分布式拒绝服务攻击&#xff08;DDoS&#xff09;是一种网络攻击方式&#xff0c;攻击者通过控制多个被感染的计算机&#xff08;僵尸网络&#xff09;同时向目标服务器发送大量的网络请求&#xff0c;导致目标服务器资源耗尽&#xff0c;无法正常提供服务…...

深入了解 kotlinx-datetime:配置与使用指南

深入了解 kotlinx-datetime&#xff1a;配置与使用指南 在Kotlin多平台开发中&#xff0c;处理日期和时间是常见的需求。kotlinx-datetime库提供了强大且简洁的API来帮助开发者应对这一挑战。本文将详细介绍如何配置kotlinx-datetime库&#xff0c;并通过生动的示例演示其核心…...

Qt编程技巧小知识点(6)根据 *IDN? 对程控仪器连接状态进行确认

文章目录 Qt编程技巧小知识点&#xff08;6&#xff09;根据 *IDN? 对程控仪器连接状态进行确认小结 Qt编程技巧小知识点&#xff08;6&#xff09;根据 *IDN? 对程控仪器连接状态进行确认 确定仪器连接问题&#xff0c;常用的是监测仪器的连接状态&#xff0c;如下代码所示&…...

【Android】Kotlin教程(4)

文章目录 1.field2.计算属性3.主构造函数4.次构造函数5.默认参数6.初始化块7.初始化顺序7.延迟初始化lateinit8.惰性初始化 1.field field 关键字通常与属性的自定义 getter 和 setter 一起使用。当你需要为一个属性提供自定义的行为时&#xff0c;可以使用 field 来访问或设置…...

机票电子行程单如何批量查验?Java机票电子行程单查验接口示例-发票查验接口

机票电子行程单来了&#xff0c;它方便了人们的出行。现如今&#xff0c;随着旅游、差旅市场的回暖与线上业务的蓬勃发展&#xff0c;机票电子行程单的需求量急剧攀升&#xff0c;如何高效且准确地查验这些电子行程单成为许多企业和财务部门关注的焦点。传统的人工查验流程耗时…...

记录element-ui改造select显示为table,并支持多查询条件

最近遇到的一个需求 &#xff0c; 很有趣&#xff0c;是需要一个select组件&#xff0c;要求显示工号&#xff0c;员工姓名&#xff0c;以及区域 三个字段&#xff0c;并且要支持三个字段的查询。显然element原生的组件不适用&#xff0c;这时候我们需要改造一下&#xff0c;把…...

Spearman、Pearson、Euclidean、Cosine、Jaccard,用来衡量不同数据之间的相似性或差异性

1. Spearman相关系数&#xff1a; 用于衡量两个变量之间的排序关系的强度和方向。Spearman相关系数关注的是两个变量的排序一致性&#xff0c;而不关心具体的数值大小。值的范围为-1到1&#xff0c;1表示完全正相关&#xff0c;-1表示完全负相关&#xff0c;0表示无相关性。常…...

Suno 歌曲生成 API 对接说明

随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的音乐。 Suno 是一个专业高质量的 AI 歌曲和音乐创作平台&#xff0c;用户…...

详细且系统的Spring Boot应用开发

为了帮助大家更好地理解如何使用Spring Boot来构建一个基础的Web应用程序&#xff0c;我将通过一个简单的例子来进行说明。这个例子将是一个基本的RESTful API服务&#xff0c;用于管理图书信息。 项目准备 1. 开发环境设置&#xff08;这个我之前有发文&#xff0c;这里就不详…...

线程支持库(C++11)

线程支持库包含了线程&#xff0c;互斥锁&#xff0c;线程条件变量(class thread)&#xff0c;定义于<thread> 线程提供一个并发的实例&#xff0c;需要对应一个“线程函数” 线程的主要任务就是去执行这个"线程函数" 既然线程需要提供一个线程函数&#xff0c…...

上海技术做网站/福州seo兼职

我的日食标志着每个带有惊叹号的新项目.我能够删除java 1.7并添加旧1.6但现在我收到此错误&#xff1a;java.lang.UnsupportedClassVersionError: klasse : Unsupported major.minor version 51.0at java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoade…...

wordpress名字修改/济南网站万词优化

1、什么是jQuery jQuery是一个JavaScript函数库。 jQuery是一个轻量级的"写的少&#xff0c;做的多"的JavaScript库。 jQuery库包含以下功能&#xff1a; HTML元素选取 HTML元素操作 CSS操作 HTML事件函数 JavaScript特效和动画 HTML DOM遍历和修改 AJAX Utilites 提…...

柳州本地做网站的公司/怎样搭建一个网站

刚开始的时候&#xff0c;每次实验都去改/etc/elasticsearch/elasticsearch.yml配置文件。事实上在template里修改settings更方便而且灵活&#xff01;当然最主要的&#xff0c;还是调节里面的properties设定&#xff0c;合理的控制store和analyze了。 template设定也有多种方法…...

寻找做项目的网站/网站建设找哪家公司好

目前越来越多的浏览器兼容CSS3标准了&#xff0c;就连IE浏览器老大哥也开始向CSS3低头&#xff0c;微软宣布IE9浏览器支持更多的CSS3属性&#xff0c;IE9更注重HTML5标准。不过CSS3里有一个使对象旋转的属性transform rotate&#xff0c;号称兼容CSS3的浏览器对它的支持也不算好…...

宁波网站怎么建设/搜索引擎收录查询工具

大家好&#xff0c;我是小鸭酱&#xff0c;博客地址为&#xff1a;http://www.cnblogs.com/xiaoyajiang pyAudioAnalysis是一个音频分析python库&#xff0c;用于Feature Extraction, Classification, Segmentation 和Applications&#xff0c;其github见 https://github.com/t…...

网页设计短期培训/百度关键词优化排名技巧

什么是 Tmux Tmux 官方 Wiki 简单来说&#xff0c;Tmux 是一个能够让你一个窗口当多个窗口使用的终端模拟器。并且你还可以将它放到后台&#xff0c;等到想使用的时候再使用。 为什么要用 Tmux 在服务器上调试程序的时候&#xff0c;经常会打开好几个窗口&#xff0c;并且每个窗…...