cyrushine / bookmark

4 stars 1 forks source link

Android 重学系列 SurfaceFlinger的概述 - 简书 - yjy239 #58

Open cyrushine opened 1 year ago

cyrushine commented 1 year ago

https://www.jianshu.com/p/c954bcceb22a

SF是整个Android系统渲染的核心进程。所有应用的渲染逻辑最终都会来到SF中进行处理,最终会把处理后的图像数据交给CPU或者GPU进行绘制。

在每一个应用中都以Surface作为一个图元传递单元,向SF这个服务端传递图元数据。

SF是以生产者以及消费者为核心设计思想,把每一个应用进程作为生产者生产图元保存到SF的图元队列中,SF则作为消费者依照一定的规则把生产者存放到SF中的队列一一处理。

为了能够跨进程的传输大容量的图元数据,使用了匿名共享内存内存作为工具把图元数据都输送到SF中处理。

SF底层有一个时间钟在不断的循环,或从硬件中断发出,或从软件模拟发出计时唤起,每隔一段时间都会获取SF中的图元队列通过CPU/GPU绘制在屏幕。

但是很可能出现下面这种情况,CPU因为繁忙来不及,显示完第一帧的时候,还没空渲染第二帧,就算SF接受到了Vsync的信号,也只能拿出已经渲染好的第一帧显示在屏幕上。这样就重复显示了第一帧,Google开发团队称这种为jank。

而三缓冲的出现,在重复显示A缓冲区的时候,CPU不会光等待而是会准备C缓冲区的图元,之后就能把C缓冲区接上。这就是Google所说的三重缓冲区的来源。

image