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在载入新帧之前,要等待屏幕绘制完成前一帧。

vsync

双缓冲机制

双重缓冲有一前一后两个缓冲区:

前缓冲区(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 的空闲等待时间提前准备好数据,并不一定会使用

       三重缓冲在双重缓冲的基础上再加入了一个帧缓冲区,组成了一个前缓冲区,两个后缓冲区的规格。程序来向两个后缓冲区写入图像,每次显示器刷新时,前缓冲区就和最近完成写入的那个后缓冲区交换。可以看到,即便有一个缓冲区要受到红绿灯的管控,另外两个缓冲区还是可以来回写入图像,于是就不需要人为增加画面延迟了。

       三冲缓冲的缺点是增加了一个额外的帧缓冲区,因为会占用更多的显存空间.

      Triple

四级流水

posted @   追随技术  阅读(476)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示