前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 垂直同步和三重缓冲[通俗易懂]

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

作者头像
全栈程序员站长
发布2022-08-31 11:37:11
1.2K0
发布2022-08-31 11:37:11
举报

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

帧率是每秒钟内游戏能够渲染的画面数量,取决于电脑的硬件配置。屏幕刷新率是屏幕在每秒钟能刷新的次数,单位是赫兹(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.cn/143414.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档