Chinese version: 慢速从屏撕裂问题分析:显示背压与 NO_FENCE 释放
What this document covers
debug.sf.follower_display_backpressure in Scheduler::onFrameSignal can skip follower work for a frame.CompositionEngine::postComposition can still fulfill release-fence promises on that path, often with Fence::NO_FENCE.Stance and scope
VSync 90 Hz, follower display 45 Hz, and the app on the follower producing 90 FPSpaced work — tearing observed. Other skews (e.g. same nominal 90 Hz / 90 FPS with follower present fences still trailing pacesetter onFrameSignal) are noted in §5 as additional context, not a substitute for that verified setup.Source references
platform/frameworks/native, branch android16-qpr2-release.android-latest-release on Android Code Search (cs.android.com) (public snapshot; use those URLs to open the exact revision and range in the viewer).Scheduler / follower skip (§2 — Scheduler.cpp, onFrameSignal)
beginFrame first; onFrameSignal then walks follower displays.follower_display_backpressure, each follower consults countPresentFencesPendingAt (unfinished present-related fences).countPresentFencesPendingAt is zero, this path does not skip—the follower still gets beginFrame.continues for that follower for this frame (no targeter.beginFrame).vsyncDeadlineAfter(frameBeginTime)) is before the pacesetter’s expectedVsyncTime for this signal—i.e. the follower’s next vsync arrives sooner than the pacesetter’s next vsync—then the scheduler does not continue and still calls beginFrame. Otherwise, any non-zero pending count triggers the skip.