From 6f9bdc88ec108bc1854375dfbc745b5536401586 Mon Sep 17 00:00:00 2001 From: MOVZX Date: Fri, 2 Jan 2026 22:27:53 +0700 Subject: [PATCH] Reduce unnecessary calls to getLatestVsyncEventData When Choreographer#doFrame is driven by MSG_DO_FRAME, since the value of VsyncEventData.frameInterval is -1, jitterNanos >= frameIntervalNanos must hold true in doFrame, and FrameData#update will call getLatestVsyncEventData (binder SurfaceFlinger). Since MSG_DO_FRAME is not VSync-driven, there is no issue of doFrame being delayed by the App (resynced), and thus FrameData#update is not required. This saves the time consumed by binder (getLatestVsyncEventData). Change-Id: I3b64b453622a7f46da5b2bfa628002f3a5fe4f93 Signed-off-by: Liangliang Sui Signed-off-by: MOVZX --- core/java/android/view/Choreographer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index d971a95859543..67a974fb88ab3 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -1024,7 +1024,9 @@ public final class Choreographer { // Calculating jitter involves using the original frame time without // adjustments from buffer stuffing final long jitterNanos = startNanos - frameTimeNanos; - if (jitterNanos >= frameIntervalNanos) { + if (jitterNanos >= frameIntervalNanos + && (timeline.mVsyncId != FrameInfo.INVALID_VSYNC_ID + || vsyncEventData.frameInterval != -1)) { frameTimeNanos = startNanos; if (frameIntervalNanos == 0) { Log.i(TAG, "Vsync data empty due to timeout");