目录
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