Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit e365502

Browse files
Map the Android VsyncWaiter frame start time to the clock used by fml::TimePoint (#29093)
1 parent 7acd2f8 commit e365502

File tree

4 files changed

+16
-12
lines changed

4 files changed

+16
-12
lines changed

shell/platform/android/io/flutter/embedding/engine/FlutterJNI.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ private static void asyncWaitForVsync(final long cookie) {
238238

239239
// TODO(mattcarroll): add javadocs
240240
public static native void nativeOnVsync(
241-
long frameTimeNanos, long frameTargetTimeNanos, long cookie);
241+
long frameDelayNanos, long refreshPeriodNanos, long cookie);
242242

243243
// TODO(mattcarroll): add javadocs
244244
@NonNull

shell/platform/android/io/flutter/view/VsyncWaiter.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public static VsyncWaiter getInstance(float fps) {
2121
}
2222

2323
private final float fps;
24+
private final long refreshPeriodNanos;
2425

2526
private final FlutterJNI.AsyncWaitForVsyncDelegate asyncWaitForVsyncDelegate =
2627
new FlutterJNI.AsyncWaitForVsyncDelegate() {
@@ -31,16 +32,19 @@ public void asyncWaitForVsync(long cookie) {
3132
new Choreographer.FrameCallback() {
3233
@Override
3334
public void doFrame(long frameTimeNanos) {
34-
long refreshPeriodNanos = (long) (1000000000.0 / fps);
35-
FlutterJNI.nativeOnVsync(
36-
frameTimeNanos, frameTimeNanos + refreshPeriodNanos, cookie);
35+
long delay = System.nanoTime() - frameTimeNanos;
36+
if (delay < 0) {
37+
delay = 0;
38+
}
39+
FlutterJNI.nativeOnVsync(delay, refreshPeriodNanos, cookie);
3740
}
3841
});
3942
}
4043
};
4144

4245
private VsyncWaiter(float fps) {
4346
this.fps = fps;
47+
refreshPeriodNanos = (long) (1000000000.0 / fps);
4448
}
4549

4650
public void init() {

shell/platform/android/vsync_waiter_android.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@ void VsyncWaiterAndroid::AwaitVSync() {
4141
// static
4242
void VsyncWaiterAndroid::OnNativeVsync(JNIEnv* env,
4343
jclass jcaller,
44-
jlong frameTimeNanos,
45-
jlong frameTargetTimeNanos,
44+
jlong frameDelayNanos,
45+
jlong refreshPeriodNanos,
4646
jlong java_baton) {
4747
TRACE_EVENT0("flutter", "VSYNC");
4848

49-
auto frame_time = fml::TimePoint::FromEpochDelta(
50-
fml::TimeDelta::FromNanoseconds(frameTimeNanos));
51-
auto target_time = fml::TimePoint::FromEpochDelta(
52-
fml::TimeDelta::FromNanoseconds(frameTargetTimeNanos));
49+
auto frame_time =
50+
fml::TimePoint::Now() - fml::TimeDelta::FromNanoseconds(frameDelayNanos);
51+
auto target_time =
52+
frame_time + fml::TimeDelta::FromNanoseconds(refreshPeriodNanos);
5353

5454
ConsumePendingCallback(java_baton, frame_time, target_time);
5555
}

shell/platform/android/vsync_waiter_android.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ class VsyncWaiterAndroid final : public VsyncWaiter {
2828

2929
static void OnNativeVsync(JNIEnv* env,
3030
jclass jcaller,
31-
jlong frameTimeNanos,
32-
jlong frameTargetTimeNanos,
31+
jlong frameDelayNanos,
32+
jlong refreshPeriodNanos,
3333
jlong java_baton);
3434

3535
static void ConsumePendingCallback(jlong java_baton,

0 commit comments

Comments
 (0)