1.开篇

很久没更新了,最近一直忙着学习一些优化相关的知识,提到手机的好坏,很多用户的第一反应都是流畅度。

接下先来讲讲我对于应用出帧的梳理。

先给放一组图,便于大家理解:

image-20240728175750120.png

2.详情梳理

  1. APP 会收到 Vsync-app信号后开始工作(Vsync-app信号并不是由HWC硬件发出的终端信号,而是由displayController生成,这一部分我们后续再讲)

  2. 这时,app的渲染线程,也就是主线程被唤醒,开始执行后续的操作。

  3. 主线程现在开始执行doFrame操作,这一部分来处理input,动画,traversal(遍历视图树)等方法。

  4. 之后app的主线程与渲染线程开始sync数据,这一步也是为了减轻cpu的压力,提高效率。

  5. 渲染线程会从sf的bufferQueue中取出一个buffer来进行合成,在操作结束之后将这个buffer queuebuffer到bufferQueue中,以供后续sf消费。

  6. sf中对应app的buffertx数量加一。

  7. 这时sf会等待Vsync-sf信号。

    这里就需要提到为什么sf信号与app信号会交错一段时间,该行为是由于安卓异步绘制导致,是为了更好的提高绘制效率与性能,这一部分是有一个动态计算机制去实现的,我目前还没有详细去学习这部分算法,后续会再出一篇文章去解读。

  8. sf会从各个bufferQueue中取出buffer合成,接着把使用后的buffer放回队列中供生产者使用。

    4ae58fcc8bf49e1abd7d1d0c098c0271.png

    为什么是各个bufferqueue?用户看到的界面是由多个层级组成的,基本上是topbar,app页面,以及底部导航栏等等,所以叫做surfacefilinger我们也称作合成的出帧操作。

  9. sf通过bind通讯与HWC通信,将最终画面展示到手机屏幕上。

    这里提到的binder机制也是安卓中非常重要的一部分内容,可以说有了binder机制之后,安卓才有了一个巨大的飞跃,后续也会有对应的文章来讲解。

    而以上,就是最简单易懂的安卓出帧流程,如果有错误的地方,欢迎大家评论区指正。