Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions packages/flutter/lib/src/scheduler/binding.dart
Original file line number Diff line number Diff line change
Expand Up @@ -853,6 +853,22 @@ mixin SchedulerBinding on BindingBase, ServicesBinding {
}
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;
String _debugBanner;
bool _ignoreNextEngineDrawFrame = false;
Expand Down
33 changes: 33 additions & 0 deletions packages/flutter/test/scheduler/scheduler_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';

import '../flutter_test_alternative.dart';
import 'scheduler_tester.dart';

class TestSchedulerBinding extends BindingBase with ServicesBinding, SchedulerBinding {
final Map<String, List<Map<String, dynamic>>> eventsDispatched = <String, List<Map<String, dynamic>>>{};
Expand Down Expand Up @@ -148,4 +149,36 @@ void main() {
expect(event['build'], 5000);
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));
});
}