Android渲染原理
参考资料:
Android渲染原理介绍 - 知乎 (zhihu.com)
Android系统上的操控延时 - 知乎 (zhihu.com)
Android上的FreeSync(下)实现方法 - 知乎 (zhihu.com)
Android Systrace 基础知识(7) - Vsync 解读 - 知乎 (zhihu.com)
Project Butter
android 4.1版本中才做了有效的优化来解决“UI流畅性”问题,就是Project Butter。
Project Butter 加入了三个核心元素:VSYNC、Triple Buffer和Choreographer。其中,VSYNC是理解Project Buffer的核心。
- VSYNC:产生一个中断信号。
- Triple Buffer:当双Buffer不够使用时,该系统可分配第三块Buffer。
- Choreographer:这个用来接受一个VSYNC信号来统一协调UI更新。
VSYNC同步机制
Vertical Synchronization,即“垂直同步”。这是一个图形学的基本概念,在 Android 中也沿用了这个概念,我们也可以把它理解为“帧同步”。
这个就是为了保证 CPU、GPU 生成帧的速度和Display刷新的速度保持一致,让显卡的运算和显示器刷新率一致以稳定输出画面质量,
它告知GPU在载入新帧之前,要等待屏幕绘制完成前一帧。
双缓冲机制
双重缓冲有一前一后两个缓冲区:
前缓冲区(Front Buffer): 用来存储发送给显示器的图像
后缓冲区(Back Buffer):用来存储GPU绘制完成的图像
Display 处理前 Front Buffer,CPU、GPU 处理 Back Buffer。
CPU/GPU只会将绘制完的图像写入后缓冲区,与此同时只有前缓冲区中的图像会被发送给显示器。
当后缓冲区中的“新鲜”图像写入完成后,注意啦,程序不会将后缓冲区的画面传输到前缓冲区,而是会进行缓冲区的交换(Swap)——将前缓冲区和后缓冲区的名字对调,即前缓冲区成了后缓冲区,后缓冲区成了前缓冲区。这样以后,刚刚绘制在后缓冲区的图像就能顺利地传给显示器了。经过这么一折腾,程序就可以在往后缓冲区写入图像的同时,不影响显卡将前缓冲区中的画面传给显示器,然后进行下一次“缓冲区交换”。如果两个缓冲区发生交换时间不加限制,有可能出现这种情况:前缓冲区中的画面才刚传输了一半给显示器,两个缓冲区就发生交换了,后面传输的都是原来后缓冲区中的画面(即下一帧画面)。于是,显示器上的一幅画面成了前后两帧的结合,这就是画面撕裂。这种问题在高帧率情况下尤为显著,因为帧率越高,前后缓冲区的交换就越为频繁,发生这种事件(画面没输出完就交换了)的概率自然也就更高。
为了解决这种问题引入VSYNC同步机制,控制缓冲区交换的时间. 在VSYNC开始发出信号时,CPU和GPU已经就开始准备下一帧的数据了,赶在下个VSYNC信号到来时,CPU, GPU渲染完成,及时传送数据给屏幕,Display绘制显示完成。不出意外的话,每一帧都会这么井然有序的进行着,在这种理想状态下,用户将会体验到如丝般顺滑的感觉。
三缓冲机制
实际情况是每一帧并非都如此井然有序,只有两个 Buffer(Android 4.1之前)时,CPU 在空闲时,如果 Back Buffer 被占用了,它也只能等待 GPU 使用之后再次进行写入。如果错过了VSYNC则只能延迟一帧,此时帧率就会降低,给人卡顿的感觉。因此Google 在 Android4.1 以后,引入了三重缓存机制:Tripple Buffer。
Tripple Buffer 利用 CPU/GPU 的空闲等待时间提前准备好数据,并不一定会使用。
三重缓冲在双重缓冲的基础上再加入了一个帧缓冲区,组成了一个前缓冲区,两个后缓冲区的规格。程序来向两个后缓冲区写入图像,每次显示器刷新时,前缓冲区就和最近完成写入的那个后缓冲区交换。可以看到,即便有一个缓冲区要受到红绿灯的管控,另外两个缓冲区还是可以来回写入图像,于是就不需要人为增加画面延迟了。
三冲缓冲的缺点是增加了一个额外的帧缓冲区,因为会占用更多的显存空间.
四级流水
本文来自博客园,作者:追随技术,转载请注明原文链接:https://www.cnblogs.com/545235abc/p/16263585.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库