From f30e10db45fc536272a2ed71b280ffc95468567c Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Mon, 11 Oct 2021 13:13:01 -0700 Subject: [PATCH] Map the Android VsyncWaiter frame start time to the clock used by fml::TimePoint (flutter/engine#29093) --- .../io/flutter/embedding/engine/FlutterJNI.java | 2 +- .../android/io/flutter/view/VsyncWaiter.java | 10 +++++++--- .../shell/platform/android/vsync_waiter_android.cc | 12 ++++++------ .../shell/platform/android/vsync_waiter_android.h | 4 ++-- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java index b06487d6143..4ac87406415 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java @@ -238,7 +238,7 @@ public class FlutterJNI { // TODO(mattcarroll): add javadocs public static native void nativeOnVsync( - long frameTimeNanos, long frameTargetTimeNanos, long cookie); + long frameDelayNanos, long refreshPeriodNanos, long cookie); // TODO(mattcarroll): add javadocs @NonNull diff --git a/engine/src/flutter/shell/platform/android/io/flutter/view/VsyncWaiter.java b/engine/src/flutter/shell/platform/android/io/flutter/view/VsyncWaiter.java index 89ff20dbee9..714511f5bb3 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/view/VsyncWaiter.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/view/VsyncWaiter.java @@ -21,6 +21,7 @@ public class VsyncWaiter { } private final float fps; + private final long refreshPeriodNanos; private final FlutterJNI.AsyncWaitForVsyncDelegate asyncWaitForVsyncDelegate = new FlutterJNI.AsyncWaitForVsyncDelegate() { @@ -31,9 +32,11 @@ public class VsyncWaiter { new Choreographer.FrameCallback() { @Override public void doFrame(long frameTimeNanos) { - long refreshPeriodNanos = (long) (1000000000.0 / fps); - FlutterJNI.nativeOnVsync( - frameTimeNanos, frameTimeNanos + refreshPeriodNanos, cookie); + long delay = System.nanoTime() - frameTimeNanos; + if (delay < 0) { + delay = 0; + } + FlutterJNI.nativeOnVsync(delay, refreshPeriodNanos, cookie); } }); } @@ -41,6 +44,7 @@ public class VsyncWaiter { private VsyncWaiter(float fps) { this.fps = fps; + refreshPeriodNanos = (long) (1000000000.0 / fps); } public void init() { diff --git a/engine/src/flutter/shell/platform/android/vsync_waiter_android.cc b/engine/src/flutter/shell/platform/android/vsync_waiter_android.cc index 2851eec5f58..1a69705f634 100644 --- a/engine/src/flutter/shell/platform/android/vsync_waiter_android.cc +++ b/engine/src/flutter/shell/platform/android/vsync_waiter_android.cc @@ -41,15 +41,15 @@ void VsyncWaiterAndroid::AwaitVSync() { // static void VsyncWaiterAndroid::OnNativeVsync(JNIEnv* env, jclass jcaller, - jlong frameTimeNanos, - jlong frameTargetTimeNanos, + jlong frameDelayNanos, + jlong refreshPeriodNanos, jlong java_baton) { TRACE_EVENT0("flutter", "VSYNC"); - auto frame_time = fml::TimePoint::FromEpochDelta( - fml::TimeDelta::FromNanoseconds(frameTimeNanos)); - auto target_time = fml::TimePoint::FromEpochDelta( - fml::TimeDelta::FromNanoseconds(frameTargetTimeNanos)); + auto frame_time = + fml::TimePoint::Now() - fml::TimeDelta::FromNanoseconds(frameDelayNanos); + auto target_time = + frame_time + fml::TimeDelta::FromNanoseconds(refreshPeriodNanos); ConsumePendingCallback(java_baton, frame_time, target_time); } diff --git a/engine/src/flutter/shell/platform/android/vsync_waiter_android.h b/engine/src/flutter/shell/platform/android/vsync_waiter_android.h index 96fcc8c0e16..03bc415e3ae 100644 --- a/engine/src/flutter/shell/platform/android/vsync_waiter_android.h +++ b/engine/src/flutter/shell/platform/android/vsync_waiter_android.h @@ -28,8 +28,8 @@ class VsyncWaiterAndroid final : public VsyncWaiter { static void OnNativeVsync(JNIEnv* env, jclass jcaller, - jlong frameTimeNanos, - jlong frameTargetTimeNanos, + jlong frameDelayNanos, + jlong refreshPeriodNanos, jlong java_baton); static void ConsumePendingCallback(jlong java_baton,