☰
Android系统DRM显示框架 - 背压backpressure
2026/10/13 3:20:12 网站建设 项目流程

 

目录

1 调度层背压

1.1 功能开关

1.2 时机触发

2 Layer 级背压(eEnableBackpressure 标志)

2.1 触发条件

2.2 layer背压影响

3 两种背压方案的异同


 

       在 Android SurfaceFlinger中,backpressure(背压)是一套显示管线中消费端将压力传导到生产端,进行显示流控的机制,目的用于防止显示/合成管线过载。其核心思想是:当下游(display / HWC / GPU 合成)消费不过来时,主动阻止上游(SF 合成、客户端提交)继续生产,把压力反向传导回去,从而控制延迟、避免掉帧和 buffer 堆积。显示管线中存在两种背压机制:调度层背压和layer级背压。

1 调度层背压

        在SurfaceFlinger的commit函数中,提交显示合成阶段。当上一帧的 present fence 尚未被 display/HWC 触发(上一帧尚未真正送显、认为还在合成处理过)时,阻止SurfaceFlinger继续执行提交(commit)去推进合成下一帧,避免新帧继续投入GPU/HWC造成合成处理堆积。

1.1 功能开关

由属性 debug.sf.enable_gl_backpressure 控制,默认开启:

mBackpressureGpuComposition = base::GetBoolProperty("debug.sf.enable_gl_backpressure"s, true);

触发条件:

                容忍时间设定,如果上一帧是HWC合成且开启调度背压的情况下,允许在判定上一帧的present fence触发时等待1ms。

                合成阻塞判断,上一帧的present fence时间晚于当前时间+1ms则认为上一帧合成阻塞。

//判断等待present fence触发时间 const int graceTimeForPresentFenceMs = static_cast<int>( mBackpressureGpuComposition || !mCompositionCoverage.test(CompositionCoverage::Gpu)); //判定上一帧的present fence是否触发 const TracedOrdinal<boolframePending={"PrevFramePending",

                        合成帧丢失判定,如果上一帧合成阻塞或者是上一帧的present fence时间大于期望presentfence时间 + 半个显示周期。

const TracedOrdinal<bool>frameMissed= {"PrevFrameMissed",framePending || (previousPresentTime >= 0 && (lastScheduledPresentTime.ns() < previousPresentTime - frameMissedSlop))}; //如果判定上一帧丢帧且上一帧为 HWC 合成,则认为是 HWC 丢帧 const TracedOrdinal<bool> hwcFrameMissed = {"PrevHwcFrameMissed", frameMissed && mCompositionCoverage.test( CompositionCoverage::Hwc)}; //如果判定上一帧丢帧且上一帧为 GPU 合成,则认为是 GPU 丢帧 const TracedOrdinal<bool> gpuFrameMissed = {"PrevGpuFrameMissed", frameMissed && mCompositionCoverage.test( Compo

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询