SurfaceFlinger中的presentFence的含义

一句话总结:PresentFence(结束点)表示你刚刚提交的这一帧(我们称之为第N帧),已经完全取代了屏幕上正在显示的上一帧(第N-l帧)。上图中红色箭头是这个Fence的起点,下面的航道里面waiting for presentFence434的结束点就是上面的结束点。

什么是Fence(同步栅栏)?

在Android图形系统中,CPU、GPU和显示控制器(Display Controller))等多个硬件单元并行工作。为了协调它们的操作,确保一个单元的工作完成后,另一个单元才能开始,系统引入了”Fnce”(同步栅栏)的概念。 你可以把一个Fence想象成一个信号旗。

  • 当一项异步任务(比如GPU渲染一帧画面)开始时,系统会创建一个Fence,此时这面“旗”是放下的(未发出信号/unsignaled)
  • 当这项任务完成后,硬件会通知内核,内核会将对应的Fence “举起来”(发出信号signaled)。
  • 需要等待这项任务结果的另一个组件(比如SurfaceFliner要合成这一帧)会“等待”这个Fence。在Fence被举起来之前,它会被高效地挂起,不消耗CPU资源。一旦Fence被举起来,它就会立即被唤醒并开始工作。

PresentFence就是众多Fence中的一种,专门用于标记与屏幕显示相关的事件。

5.4.PresentFence (Retire Fence)

来源:由HWC的presentDisplay调用为整个合成帧返回

  • **HWC(Hardware Composer): **这是Android中的一个硬件抽象层模块。它的主要职责是将屏幕上不同的“图层”(Layers),比如状态栏、导航栏、正在运行的应用窗口等,高效地合成为最终要在屏幕上显示的一帧画面。如果硬件支持,HWC可以直接利用专门的显示硬件来完成这个合成过程,从而分担GPU的压力,降低功耗。
  • SurfaceFlinger: 这是Android的系统级服务,是所有图形绘制的“总指挥”。它收集所有应用窗口和系统UI的图层,决定它们的位置和顺序,然后将这些图层交给HWC去合成。 ·
  • presentDisplay调用:当SurfaceFlinger准备好一帧的数据,并交给HWC合成后,它会调用HWC的 presentDisplay函数。这个调用的意思是:“嘿,HWC,请把刚刚合成好的这一帧画面,送到屏幕上去显示吧。”
  • 返回retireFenceFd: HWC在接收到这个指令后,会返回一个文件描述符(file descriptor),这个描述符就代表了PresentFence(在早期的HWC版本中,它被称为retireFence,所以这两个名字经常互用)。

核心要点:PresentFence是由显示硬件(通过HWC)在“提交新的一帧”这个动作发生时所创建并返回给系统上层(SurfaceFliner)的一个信物。 目的:前一帧的合成内容已在显示器上被完全替换 这个Fence的核心目的是提供一个精确的时间点反馈。当这个Fence发出信号时(被举起来时),它代表的事件是:

你刚刚提交的这一帧(我们称之为第N帧),已经完全取代了屏幕上正在显示的上一帧(第N-1帧)。 换句话说,当PresentFence信号被触发时,显示控制器已经不再读取第N-1帧的内存数据了。第N-1帧的缓冲区已经“退役”(Retire),可以安全地被释放或重新用于绘制新的内容(比如第N+2帧)。这个信号是确保图形缓冲区能够安全、高效循环使用的关键。

等待方1用户1(调度器):DispSync

  • **DispSync是什么?**它是SurfaceFlinger内部的一个服务,负责预测和同步屏幕的VSYNC(垂直同步)信号。 VSYNC就像是显示器的心跳,屏幕每刷新一次,就会产生一个VSYNC信号。应用和SurfaceFlinger都需要跟着 这个心跳节奏来准备新的帧,才能保证画面流畅。
  • PLL(Phase-Locked Loop锁相环):DispSync的工作原理类似于一个软件实现的“锁相环”。它会建立一个 VSYNC的数学模型来预测下一次VSYNC何时到来,而不是完全依赖于硬件可能产生抖动(jitter))的VSYNC信 号0
  • 闭合反馈回路:任何预测模型都需要有真实数据来进行校准,否则误差会越积越大。PresentFence就提供了这个至关重要的真实数据反馈。 a.DispSync预测VSYNC,并指导SurfaceFlinger在特定时间点调用presentDisplayo b.HWC返▣一个PresentFenceo c.DispSync会等待这个Fence发出信号o d.Fence发出信号的时间点,就是这一帧真正被物理显示的最精确时间。 e.DispSync会比较这个“真实显示时间”和自己模型的“预测显示时间”。如果存在偏差,它就会调整自己的内部模型,确保下一次的预测更准。

通过这个“预测提交等待Fence>验证校正”的闭环,DispSync能够极其精确地与显示硬件的刷新周期保持同步,这是Android系统黄油般流畅(Project Butter))的核心技术之一。

等待方用户2(应用):通过ASurfaceTransactionStats提供精确分析数据

对于追求极致性能的应用(如游戏引擎、视频播放器等),仅仅知道自己何时完成了渲染是不够的,它们更想知道自己 渲染的帧究竟在何时被用户看到。

  • ASurfaceTransaction AP:这是Android NDK中提供的一套更现代、更底层的API,允许应用对图层(Surface) 进行更精细的控制和事务性提交。
  • ASurfaceTransactionStats:当应用使用这套API提交一帧更新后,可以请求系统返回一个 ASurfaceTransactionStats结构体。这个结构体里包含了关于这一帧从提交到最终显示的各种时间戳信息。
  • 信息回传:系统内部,正是利用了PresentFence发出信号的时间点,来填充ASurfaceTransactionStats中的“实际呈现时间”(presentTime)。这个时间戳告诉应用:“你提交的这一帧,是在这个精确的纳秒级时间点出现在屏幕上 的。”

有了这个精确的反馈,开发者可以:

  • 精确计算“端到端”延迟:从用户输入(触摸屏幕)到画面响应(新帧显示)的总延迟。
  • 分析性能瓶颈:判断延迟是发生在应用渲染阶段,还是系统合成阶段。
  • 实现高级的帧同步逻辑:例如,动态调整渲染负载,以确保每一帧都能在VSYNC到来前准备好,从而避免卡顿和掉帧。

PresentFence(或RetireFence)是Android图形栈中一个底层但至关重要的同步信物。它由硬件显示模块在接收到新一帧时生成,并在该帧完全替换掉旧帧时发出信号。这个精确的信号构成了系统调度器DispSync的核心反馈回路,保证了VSYNC模型的准确性;同时,它也为上层应用提供了精确的帧呈现时间戳,使得深度的性能分析和优化成为可能。它是连接硬件行为和软件调度的桥梁,是确保整个Android系统图形流畅性的基石之一。