WMS相关知识点(二)

news2024/11/25 2:57:36

目录

  • 一、Android 图形显示系统
    • 1. 从下层往上层理解

一、Android 图形显示系统

1. 从下层往上层理解

1.1 显示屏
显示屏上的内容,是从硬件帧缓冲区的,大致读取过程为:从Buffer的起始地址开始,从上往下,从左往右(一行一行读取)扫描整个Buffer,将内容映射到显示屏上。扫描一行显示一行
在这里插入图片描述
如果同时读写会引起屏幕的撕裂,该如何解决?
答:方式一:加锁,在写入的时候对其进行加锁,写完之后才对锁的释放,读取的时候也是一样,只要读取完毕之后才能进行写入。但是该方式的缺点就是加锁会造成性能的浪费
方式二:增加缓冲区,用来显示内容到屏幕的帧缓冲区叫前缓冲区,增加一个后缓冲区,用于后台合成下一帧图形的帧缓冲区,这样可以同时的进行写和读,而且不是对同一块资源进行增强。这样既能够解决掉同时增强资源引起的屏幕撕裂问题,也能避免对资源的浪费。在这里插入图片描述
  其中,前缓冲区和后缓冲区可以进行交换(地址进行更换就好),前缓冲区变成后缓冲区,后缓冲区变成前缓冲区。
在这里插入图片描述
增加双缓冲区的好处:
① 避免资源的争抢
② 避免性能的浪费

  然而,上面假设“当前一帧显示完毕,后一帧准备好了”的情况,在现实中这两个事件并非同时完成,那么屏幕扫描缓冲区的速度和系统合成帧的速度之间有什么关系呢?
屏幕刷新率(HZ):代表屏幕在一秒内刷新屏幕的次数,Android手机一般为60HZ(也就是1秒刷新60帧,大约16.67毫秒刷新1帧)
系统帧速率(FPS):代表了系统在一秒内合成的帧数,该值的大小由系统算法和硬件决定。

我们用以下两个假设来分析两者的关系:
①屏幕刷新速率比系统帧速率快
  此时,在前缓冲区内容全部映射到屏幕之后,后缓冲区尚未准备好下一帧,屏幕将无法读取下一帧,所以只能继续显示当前一帧的图形,造成一帧显示多次,也就是卡顿。
②系统帧速率比屏幕刷新速率快
  此时,屏幕未完全把前缓冲区的一帧映射到屏幕,而系统已经在后缓冲区准备好了下一帧,并要求读取下一帧到屏幕,将会导致屏幕上半部分是上一帧的图形,而下半部分是下一帧的图形,造成屏幕上显示多帧,也就是屏幕撕裂。
  上面两中情况,都会导致问题,根本原因就是两个缓冲区的操作速率不一致,解决办法就是让屏幕控制前后缓冲区的切换,让系统帧速率配合屏幕刷新率的节奏。

Drawing with VSYNC
在这里插入图片描述
Time:从左到右流动变化
CPU:生成图片
GPU:合成图片
Display:显示图片,那一行上的数字表示第几帧,比如0表示第0帧,在第0帧上CPU、GPU在生成合成第一帧的内容。合成完成VSync信号来了就显示第一帧的内容。

但这种模式有一定的缺点:
  Display上的数字是逐步增长的,这些数据都是要放在一个个缓存buffer上,这样开辟的控件就越多,旧的没有进行回收复用,这样就浪费性能

Parallel Processing and Double Buffering

在这里插入图片描述
好处:在整个过程中只有A、B两个Buffer,不会再去开辟新的空间,对以前空间进行了很好的利用,减少CPU计算性能的浪费,减少了内存的开辟。
Jank:表示一帧显示了多次,造成了卡顿
造成卡顿原因:从上图可以看出,GPU在合同B或者A的时候超出了一帧的时间,一帧内没有合成完,只能复用上一帧的内容,具体原因可能是主线程里面做了耗时工作
  从上图可以看出,CPU和GPU流程过程中其实是很多空闲时间给浪费掉了,从而延申出三缓冲的思想。

  谷歌文档中,给出了这样的解释:假如缓冲区B的处理需要较长时间,并且A正在使用中显示当前帧。此时引入第三个缓冲区,则CPU与GPU不会空等,而是系统创建C缓冲区,可以避免下一次jank,从而让系统变得流畅,通俗来讲就是减少红绿灯的等待。

Parallel Processing and Triple Buffering
在这里插入图片描述
三缓存与双缓存的区别就是利用卡顿的时间即在CPU或者GPU空闲的时候进行第三个缓存的生成与合成操作,减少后续卡顿事件
一个window对应一个surface(一个window对应一个图层),一个surface对应三个buffer

  如果说SurfaceFlinger是图形的合成者,那么图形的提供者就是上层。图形的传递是通过Buffer作为载体,Surface是对Buffer的进一步封装,也就是说Surface内部具有多个Buffer供上层使用,如何管理这些Buffer呢?请看下面这个模型:

在这里插入图片描述

  surface内部提供了一个BufferQueue,与上层和SurfaceFlinger形成一个生产者消费者模型,上层对应Producer,SurfaceFlinger对应Consumer。三者通过Buffer产生联系,每个Buffer都有四种状态:

  • Free:可被上层使用
  • Dequeued:出列,正在被上层使用
  • Queued:入列,已完成上层绘制,等待SurfaceFlinger合成
  • Acquired:被获取,SurfaceFlinger正持有该Buffer进行合成

在这里插入图片描述
  不能直接对BufferQueue进行操作,从而出于安全考虑弄了一个生产者和消费者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/385421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis持久化RDB和AOF

Redis 是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将 Redis 中的数据以某种形式(数据或命令)从内存保存到硬盘。当下次 Redis 重启时,利用持久化文件实现数据恢复。除…

《C++ Primer》 第十二章 动态内存

《C Primer》 第十二章 动态内存 动态内存与智能指针 shared_ptr允许多个指针指向同一个对象;unique_ptr则“独占”所指向的对象,weak_ptr指向shared_ptr所管理的对象。这三种类型都定义在memory头文件中。 shared_ptr类:默认初始化的智能…

Docker容器化部署.net core API

1.为API集成Docker环境。(VS自带,傻瓜式操作) 1.1 点击项目,右键,添加,选择Docker支持 1.2 找到项目根目录中的Dockerfile文件,这是VS刚刚帮我们自动生成的。进入和做如图标红地方修改。 把文…

map和set 的封装

文章目录引入key-value模型map和set底层setset的几个重要接口mapmap几个重要的接口map和set的封装引入 对于map和set的引入,我们用一道在程序中常见的问题解决: 给定一个数组int arr[]{1,2,1,3,1,4,1,5,5,2,3,4,5};,给出以下问题的解决方案&…

【基础算法】双指针---最长连续不重复子序列

🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…

html基础(列表(ul、ol、dl)、表格table、表单(input、button、label)、div和span、空格nbsp)

1无序列表<ul>和有序列表<ol>1.1无序列表<ul><!-- 无序列表 --><ul><li>吃饭</li><li>睡觉</li><li>打豆豆</li></ul>1.2有序列表<ol><!-- 有序列表 --><ol><li>吃饭</li…

电机控制中的2个重要变量(速度和转矩)

电机控制的其它相关内容,大家可以参看专栏的系列文章,链接如下: 运动控制系统(伺服3环)_运动控制三环控制周期_RXXW_Dor的博客-CSDN博客1 、这篇作为运动控制系列的第一篇吧,后续慢慢更新关于PLC的运动控制https://blog.csdn.net/m0_46143730/article/details/124075713…

阿里10年测开经验分享-我的软件测试之路也并不是一帆风顺

简单的先说一下&#xff0c;坐标西安&#xff0c;16届本科毕业&#xff0c;目前在跳槽&#xff0c;一共有面试了有5家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09; 其中成功的有5家&#xff0c;另外2…

你不会工作1年了连枚举都还不知道吧?

文章目录一、枚举(Enum)1.1 枚举概述1.2 定义枚举类型1.2.1 静态常量案例1.2.2 枚举案例1.2.3 枚举与switch1.3 枚举的用法1.3.1 枚举类的成员1.3.2 枚举类的构造方法1&#xff09;枚举的无参构造方法2&#xff09;枚举的有参构造方法1.3.3 枚举中的抽象方法1.4 Enum 类1.4.1 E…

Azure OpenAI 官方指南02|ChatGPT 的架构设计与应用实例

ChatGPT 作为即将在微软全球 Azure 公有云平台正式发布的服务&#xff0c;已经迅速成为了众多用户关心的服务之一。而由 OpenAI 发布的 ChatGPT 产品&#xff0c;仅仅上线两个月&#xff0c;就成为互联网历史上最快突破一亿月活的应用。本期从技术角度深度解析 ChatGPT 的架构设…

大数据平台小结

搭建大数据平台启动流程1、启动Nginx服务&#xff08;在bdp-web-mysql服务中&#xff09;cd /usr/local/nginx/# 启动Nginx ./sbin/nginx# 查看端口是否存在 netstat -tunlp|grep 200012、启动zookeeper&#xff08;在bdp-executor-realtime123&#xff09;cd /app/bdp/apache-…

二.项目使用vue-router,引入ant-design-vue的UI框架,引入less

根据前文《使用Vue脚手架工具搭建vue项目》搭建好脚手架后使用 1.vue-router 2.引入UI框架ant design vue 3.引入less 1.vue-router vue-router分为两种模式(默认为hash模式)&#xff1a; hash history hash&#xff1a; 特征&#xff1a; 1.hash会在浏览器路径里带#号&#…

高质量数字化转型创新发展大会暨中国信通院“铸基计划”年度会议成功召开

2023年3月3日&#xff0c;由中国信通院主办的高质量数字化转型创新发展大会暨中国信通院“铸基计划”年度会议在北京成功召开。本次大会深度展示了中国信通院在数字化领域的工作成果&#xff0c;并全面展望了2023年行业的数字化发展趋势。同时&#xff0c;大会发布了中国信通院…

C语言入门知识——(7)VS2022的C语言基础调试

1、什么是bug 这个故事很多人都知道 1947年9月9日&#xff1a;第一个“Bug”被发现的时候&#xff1a;“1949年9月9日&#xff0c;我们晚上调试机器的时候&#xff0c;开着的窗户没有纱窗&#xff0c;机器闪烁的亮光几乎吸引来了世界上所有的虫子。果然机器故障了&#xff0c;…

Qt使用OpenGL进行多线程离屏渲染

基于Qt Widgets的Qt程序&#xff0c;控件的刷新默认状况下都是在UI线程中依次进行的&#xff0c;换言之&#xff0c;各个控件的QWidget::paintEvent方法会在UI线程中串行地被调用。若是某个控件的paintEvent很是耗时&#xff08;等待数据时间CPU处理时间GPU渲染时间&#xff09…

BI不是报表,千万不要混淆

商业智能BI作为商业世界的新宠儿&#xff0c;在市场上实现了高速增长并获得了各领域企业的口碑赞誉。 很多企业把商业智能BI做成了纯报表&#xff0c;二维表格的数据展现形式&#xff0c;也有一些简单的图表可视化。但是这些简单的商业智能BI可视化报表基本上只服务到了一线的…

【JAVA程序设计】【C00110】基于SSM(非maven)的车辆维修管理系统

基于SSM&#xff08;非maven&#xff09;的车辆维修管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架非maven开发的车辆维修管理系统共分为三个角色&#xff1a;管理员、用户 管理员角色包含以下功能&#xff1a; 查看用户、添加用户、查看车辆信息、故…

FPGA纯verilog实现图像视频旋转 串口指令控制旋转角度 提供工程源码和技术支持

目录1、前言2、理论基础3、设计思路和框架图像输入和采集图像旋转处理图像缓存图像输出4、vivado工程详解5、上板调试验证6、福利&#xff1a;工程代码的获取1、前言 图像旋转是一种常用的图像处理技术&#xff0c;其基本原理就是指图像以某一点为中心旋转一定的角度&#xff…

函数的极限

目录 函数极限的定义&#xff1a; 数列的极限和函数极限 定理1&#xff1a; 自变量趋向有限制时&#xff0c;函数的极限 左右极限&#xff1a; 定理&#xff1a; 需要分左右极限求极限的三种问题&#xff1a; 例题&#xff1a; 例2&#xff1a; 极限性质&#xff1a; 保号…

WebRTC标准与框架解读(1)

1、如果让我来设计webrtc框架我在分析源码的时候&#xff0c;都喜欢做这样一件事情&#xff1a;如果让我来设计它&#xff0c;我会怎么做&#xff1f;大家可以紧跟我的思路&#xff0c;分析一下WebRTC为什么如此设计。为了对整个框架有有一个全面的了解&#xff0c;我们首先要做…