mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Map the Android VsyncWaiter frame start time to the clock used by fml::TimePoint (flutter/engine#29093)
This commit is contained in:
parent
b201dc0a1f
commit
f30e10db45
@ -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
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user