Android 垂直同步和三重缓冲[通俗易懂]

Android 垂直同步和三重缓冲[通俗易懂]帧率是每秒钟内游戏能够渲染的画面数量,取决于电脑的硬件配置。屏幕刷新率是屏幕在每秒钟能刷新的次数,单位是赫兹(Hz),这取决于显示器的硬件配置。假设CPU/GPU性能高在你的游戏中能够获得超过200帧的画面,但是由于显示器刷新率只有30Hz,只能“抓取”其中的30帧进行显示,最终你所看到的画面也是30帧。屏幕刷新率越高,你在每秒钟内就能看到越多的画面,因此对你来说,画面也就更加“流畅”、“清晰”。一个页面的渲染流程大致分为一下几步,CPU将界面处理对应的图形数据,然后GPU将图形数据栅格化,最后屏

大家好,又见面了,我是你们的朋友全栈君。

帧率是每秒钟内游戏能够渲染的画面数量,取决于电脑的硬件配置。屏幕刷新率是屏幕在每秒钟能刷新的次数,单位是赫兹(Hz),这取决于显示器的硬件配置。假设CPU/GPU 性能高在你的游戏中能够获得超过200帧的画面,但是由于显示器刷新率只有30Hz,只能“抓取”其中的30帧进行显示,最终你所看到的画面也是30帧。
屏幕刷新率越高,你在每秒钟内就能看到越多的画面,因此对你来说,画面也就更加“流畅”、“清晰”。

一个页面的渲染流程大致分为一下几步,CPU 将界面处理对应的图形数据,然后GPU 将图形数据栅格化,最后屏幕读取 GPU 的缓冲区来显示。
在最初屏幕读取缓冲区只有一个,当界面还没有渲染完毕时,GPU 已经将下一帧的界面栅格化,帧率和刷新频率不同且没有垂直同步会这样会造成画面撕裂的情况,因为只有一个缓冲区,上部分已经显示下一帧,而下部分是上一帧。

为了解决帧率大于刷新频率就出现了垂直同步+双缓冲方案,目前主流的设备帧率是60帧,也就是每16毫秒一帧画面,垂直同步就是以单位时间(1000/帧率)来调度刷新,这样来保证页面不撕裂,当界面还没渲染完毕时, GPU 会把下一帧的数据栅格化数据写入 Back Buffer,当页面渲染完毕,将 Frame Buffer 的指针指向 Back Buffer,这样做到无缝衔接。

GPU 有两块缓冲区Frame Buffer 和 Back Buffer,Frame Buffer 是一个二维数组,里面存放的是屏幕对应到每一个像素点的颜色信息,CPU 计算图形数据完毕后会写入 Back Buffer,GPU 会定时对 Frame Buffer 和 Back Buffer 进行处理,Back Buffer 也并不一定是必然存在的,首先它是因为屏幕刷新率和帧率不同步造成的,当二者不同时,为了避免屏幕撕裂这个时候才会创建 Back Buffer,但是二重缓冲还是有问题,举例说明如果主线程要处理的东西比较多,导致 CPU/GPU 完成一帧用了26毫秒,那么垂直同步机制的回调在本该在16毫秒的刷新是无效的,因为当前的缓冲区还是上一帧的数据,因为当前帧的数据还没有计算完毕并写入缓冲区,,会产生 Jank也就是丢帧,同时在20毫秒至32毫秒这段时间,CPU/GPU 是闲置的。

为了解决Jank丢帧问题,Android 比 IOS 多设计了一个缓冲区 Triple Buffer,为了不让 CPU/GPU 闲置,Triple Buffer 和 Back Buffer 的工作原理是一样的,相当于多了一个Back Buffer, 同时也是用到时才会创建,为了提高性能。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143414.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 单模光纤的传输距离比多模光纤的传输距离_单模多模单模光纤传感器

    单模光纤的传输距离比多模光纤的传输距离_单模多模单模光纤传感器1.1000Base-SX及1000Base-LX是什么意思?短波长光传输1000Base-SX、长波长光传输1000Base-LX多模光纤可以分为长波激光(称为1000BaseLX)和短波激光(称为1000BaseSX)。2.千兆位以太网标准问题:请问多模和单模光纤的极限传输距离是多少?标准光纤类型光纤直径(μm)最大传输距离1000base-sx多模62.5260m1000base-sx…

    2022年8月30日
  • 数据库按条件查询语句_sql多条件筛选语句

    数据库按条件查询语句_sql多条件筛选语句文章目录前言一、单条件查询二、多条件查询前言1.熟练掌握where子句各类运算符的使用2.熟练掌握多条件查询and、or的使用一、单条件查询在SQL中,insert、update、delete和select后面都能带where子句,用于插入、修改、删除或查询指定条件的记录SELECTcolumn_nameFROMtable_nameWHEREcolumn_name运算符value语句:select*fromtable_namewherecolumn_name运

    2022年9月4日
  • 阿里云服务器怎样开放端口

    阿里云服务器怎样开放端口1、登录阿里云官方2、进入控制台3、在控制台里点击产品与服务——云服务器ECS4、在云服务器ECS选项里点击网络和安全——安全组5、可以自己创建安全组,也可以现有的配置规则6、然后点击右上方的添加安全组规则7、填上端口号,允许的ip地址,点击确定就可以了端口例如:8001/8001授权对象:0.0.0.0/0…

    2022年9月26日
  • wpf滑动动画_旋转平移矩阵

    wpf滑动动画_旋转平移矩阵在WPF动画中常见的动画就平移、缩放以及旋转,一般会用到故事板(Storyboard)和浮点动画(DoubleAnimation),下面我们先对这两个进行具体的介绍,因为本次我们主要利用故事板来添加动画:一.Storyboard:俗称故事板,在VS中意思是,一个容器的时间线,该时间线为子动画提供对象和属性确定信息:其重要的两个方法`Storyboard.SetTarget();`绑定动画和`Storyboard.SetTargetProperty();`依赖的属性一般用法有:Storyboard

    2022年10月21日
  • docker安装Lefse和分析流程[通俗易懂]

    docker安装Lefse和分析流程[通俗易懂]linux通过docker安装lefse默认你已经安装好docker!下载lefse镜像文件dockerrun-itbiobakery/lefsebash启动docker的lefse镜像,并且把主机文件夹挂载到镜像,这样可以在镜像中看到主机中的文件夹,下面是吧主机中的Data文件夹挂在到镜像(shared文件夹需要自己建),更改Data权限shared权限也会改变…

    2022年5月28日
  • 安装多版本php(php5.6,php7.2)

    安装多版本php(php5.6,php7.2)安装多版本php(php5.6,php7.2)

    2022年4月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号