Unverified Commit 4ca7bfa0 authored by Michael Goderbauer's avatar Michael Goderbauer Committed by GitHub

Re-apply 'Add currentSystemFrameTimeStamp to SchedulerBinding' (#35492)

parent 2d2bb6bf
...@@ -853,6 +853,22 @@ mixin SchedulerBinding on BindingBase, ServicesBinding { ...@@ -853,6 +853,22 @@ mixin SchedulerBinding on BindingBase, ServicesBinding {
} }
Duration _currentFrameTimeStamp; Duration _currentFrameTimeStamp;
/// The raw time stamp as provided by the engine to [Window.onBeginFrame]
/// for the frame currently being processed.
///
/// Unlike [currentFrameTimeStamp], this time stamp is neither adjusted to
/// offset when the epoch started nor scaled to reflect the [timeDilation] in
/// the current epoch.
///
/// On most platforms, this is a more or less arbitrary value, and should
/// generally be ignored. On Fuchsia, this corresponds to the system-provided
/// presentation time, and can be used to ensure that animations running in
/// different processes are synchronized.
Duration get currentSystemFrameTimeStamp {
assert(_lastRawTimeStamp != null);
return _lastRawTimeStamp;
}
int _debugFrameNumber = 0; int _debugFrameNumber = 0;
String _debugBanner; String _debugBanner;
bool _ignoreNextEngineDrawFrame = false; bool _ignoreNextEngineDrawFrame = false;
......
...@@ -10,6 +10,7 @@ import 'package:flutter/scheduler.dart'; ...@@ -10,6 +10,7 @@ import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import '../flutter_test_alternative.dart'; import '../flutter_test_alternative.dart';
import 'scheduler_tester.dart';
class TestSchedulerBinding extends BindingBase with ServicesBinding, SchedulerBinding { class TestSchedulerBinding extends BindingBase with ServicesBinding, SchedulerBinding {
final Map<String, List<Map<String, dynamic>>> eventsDispatched = <String, List<Map<String, dynamic>>>{}; final Map<String, List<Map<String, dynamic>>> eventsDispatched = <String, List<Map<String, dynamic>>>{};
...@@ -148,4 +149,36 @@ void main() { ...@@ -148,4 +149,36 @@ void main() {
expect(event['build'], 5000); expect(event['build'], 5000);
expect(event['raster'], 4000); expect(event['raster'], 4000);
}); });
test('currentSystemFrameTimeStamp is the raw timestamp', () {
Duration lastTimeStamp;
Duration lastSystemTimeStamp;
void frameCallback(Duration timeStamp) {
expect(timeStamp, scheduler.currentFrameTimeStamp);
lastTimeStamp = scheduler.currentFrameTimeStamp;
lastSystemTimeStamp = scheduler.currentSystemFrameTimeStamp;
}
scheduler.scheduleFrameCallback(frameCallback);
tick(const Duration(seconds: 2));
expect(lastTimeStamp, Duration.zero);
expect(lastSystemTimeStamp, const Duration(seconds: 2));
scheduler.scheduleFrameCallback(frameCallback);
tick(const Duration(seconds: 4));
expect(lastTimeStamp, const Duration(seconds: 2));
expect(lastSystemTimeStamp, const Duration(seconds: 4));
timeDilation = 2;
scheduler.scheduleFrameCallback(frameCallback);
tick(const Duration(seconds: 6));
expect(lastTimeStamp, const Duration(seconds: 2)); // timeDilation calls SchedulerBinding.resetEpoch
expect(lastSystemTimeStamp, const Duration(seconds: 6));
scheduler.scheduleFrameCallback(frameCallback);
tick(const Duration(seconds: 8));
expect(lastTimeStamp, const Duration(seconds: 3)); // 2s + (8 - 6)s / 2
expect(lastSystemTimeStamp, const Duration(seconds: 8));
});
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment