mirror of
https://github.com/flutter/flutter
synced 2024-10-13 11:42:54 +00:00
Re-apply 'Add currentSystemFrameTimeStamp to SchedulerBinding' (#35492)
This commit is contained in:
parent
2d2bb6bf92
commit
4ca7bfa0c2
|
@ -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;
|
||||
|
|
|
@ -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>>>{};
|
||||
|
@ -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));
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue