Unverified Commit 8f75d537 authored by Keerti Parthasarathy's avatar Keerti Parthasarathy Committed by GitHub

Revert "redux of a change to use new engine APIs for Flutter.Frame events (#34365)" (#34514)

This reverts commit ceb09b8b.
parent ceb09b8b
...@@ -6,11 +6,12 @@ import 'dart:async'; ...@@ -6,11 +6,12 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:vm_service_client/vm_service_client.dart';
import 'package:flutter_devicelab/framework/adb.dart'; import 'package:flutter_devicelab/framework/adb.dart';
import 'package:flutter_devicelab/framework/framework.dart'; import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/framework/utils.dart'; import 'package:flutter_devicelab/framework/utils.dart';
import 'package:path/path.dart' as path;
import 'package:vm_service_client/vm_service_client.dart';
void main() { void main() {
task(() async { task(() async {
...@@ -56,19 +57,10 @@ void main() { ...@@ -56,19 +57,10 @@ void main() {
final VMServiceClient client = VMServiceClient.connect('ws://localhost:$vmServicePort/ws'); final VMServiceClient client = VMServiceClient.connect('ws://localhost:$vmServicePort/ws');
final VM vm = await client.getVM(); final VM vm = await client.getVM();
final VMIsolateRef isolate = vm.isolates.first; final VMIsolateRef isolate = vm.isolates.first;
final Stream<VMExtensionEvent> frameEvents = isolate.onExtensionEvent.where(
final StreamController<VMExtensionEvent> frameEventsController = StreamController<VMExtensionEvent>(); (VMExtensionEvent e) => e.kind == 'Flutter.Frame');
final StreamController<VMExtensionEvent> navigationEventsController = StreamController<VMExtensionEvent>(); final Stream<VMExtensionEvent> navigationEvents = isolate.onExtensionEvent.where(
isolate.onExtensionEvent.listen((VMExtensionEvent event) { (VMExtensionEvent e) => e.kind == 'Flutter.Navigation');
if (event.kind == 'Flutter.Frame') {
frameEventsController.add(event);
} else if (event.kind == 'Flutter.Navigation') {
navigationEventsController.add(event);
}
});
final Stream<VMExtensionEvent> frameEvents = frameEventsController.stream;
final Stream<VMExtensionEvent> navigationEvents = navigationEventsController.stream;
print('reassembling app...'); print('reassembling app...');
final Future<VMExtensionEvent> frameFuture = frameEvents.first; final Future<VMExtensionEvent> frameFuture = frameEvents.first;
...@@ -79,17 +71,13 @@ void main() { ...@@ -79,17 +71,13 @@ void main() {
print('${event.kind}: ${event.data}'); print('${event.kind}: ${event.data}');
// validate the fields // validate the fields
// {number: 8, startTime: 0, elapsed: 1437, build: 600, raster: 800} // {number: 8, startTime: 0, elapsed: 1437}
expect(event.data['number'] is int); expect(event.data['number'] is int);
expect(event.data['number'] >= 0); expect(event.data['number'] >= 0);
expect(event.data['startTime'] is int); expect(event.data['startTime'] is int);
expect(event.data['startTime'] >= 0); expect(event.data['startTime'] >= 0);
expect(event.data['elapsed'] is int); expect(event.data['elapsed'] is int);
expect(event.data['elapsed'] >= 0); expect(event.data['elapsed'] >= 0);
expect(event.data['build'] is int);
expect(event.data['build'] >= 0);
expect(event.data['raster'] is int);
expect(event.data['raster'] >= 0);
final Future<VMExtensionEvent> navigationFuture = navigationEvents.first; final Future<VMExtensionEvent> navigationFuture = navigationEvents.first;
// This tap triggers a navigation event. // This tap triggers a navigation event.
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
import 'dart:async'; import 'dart:async';
import 'dart:collection'; import 'dart:collection';
import 'dart:developer' show Flow, Timeline; import 'dart:developer';
import 'dart:ui' show AppLifecycleState, FramePhase, FrameTiming; import 'dart:ui' show AppLifecycleState;
import 'package:collection/collection.dart' show PriorityQueue, HeapPriorityQueue; import 'package:collection/collection.dart' show PriorityQueue, HeapPriorityQueue;
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
...@@ -198,17 +198,6 @@ mixin SchedulerBinding on BindingBase, ServicesBinding { ...@@ -198,17 +198,6 @@ mixin SchedulerBinding on BindingBase, ServicesBinding {
window.onDrawFrame = _handleDrawFrame; window.onDrawFrame = _handleDrawFrame;
SystemChannels.lifecycle.setMessageHandler(_handleLifecycleMessage); SystemChannels.lifecycle.setMessageHandler(_handleLifecycleMessage);
readInitialLifecycleStateFromNativeWindow(); readInitialLifecycleStateFromNativeWindow();
if (!kReleaseMode) {
int frameNumber = 0;
window.onReportTimings = (List<FrameTiming> timings) {
for (FrameTiming frameTiming in timings) {
frameNumber += 1;
_profileFramePostEvent(frameNumber, frameTiming);
}
};
}
} }
/// The current [SchedulerBinding], if one has been created. /// The current [SchedulerBinding], if one has been created.
...@@ -853,7 +842,8 @@ mixin SchedulerBinding on BindingBase, ServicesBinding { ...@@ -853,7 +842,8 @@ mixin SchedulerBinding on BindingBase, ServicesBinding {
} }
Duration _currentFrameTimeStamp; Duration _currentFrameTimeStamp;
int _debugFrameNumber = 0; int _profileFrameNumber = 0;
final Stopwatch _profileFrameStopwatch = Stopwatch();
String _debugBanner; String _debugBanner;
bool _ignoreNextEngineDrawFrame = false; bool _ignoreNextEngineDrawFrame = false;
...@@ -904,9 +894,13 @@ mixin SchedulerBinding on BindingBase, ServicesBinding { ...@@ -904,9 +894,13 @@ mixin SchedulerBinding on BindingBase, ServicesBinding {
if (rawTimeStamp != null) if (rawTimeStamp != null)
_lastRawTimeStamp = rawTimeStamp; _lastRawTimeStamp = rawTimeStamp;
assert(() { if (!kReleaseMode) {
_debugFrameNumber += 1; _profileFrameNumber += 1;
_profileFrameStopwatch.reset();
_profileFrameStopwatch.start();
}
assert(() {
if (debugPrintBeginFrameBanner || debugPrintEndFrameBanner) { if (debugPrintBeginFrameBanner || debugPrintEndFrameBanner) {
final StringBuffer frameTimeStampDescription = StringBuffer(); final StringBuffer frameTimeStampDescription = StringBuffer();
if (rawTimeStamp != null) { if (rawTimeStamp != null) {
...@@ -914,7 +908,7 @@ mixin SchedulerBinding on BindingBase, ServicesBinding { ...@@ -914,7 +908,7 @@ mixin SchedulerBinding on BindingBase, ServicesBinding {
} else { } else {
frameTimeStampDescription.write('(warm-up frame)'); frameTimeStampDescription.write('(warm-up frame)');
} }
_debugBanner = '▄▄▄▄▄▄▄▄ Frame ${_debugFrameNumber.toString().padRight(7)} ${frameTimeStampDescription.toString().padLeft(18)} ▄▄▄▄▄▄▄▄'; _debugBanner = '▄▄▄▄▄▄▄▄ Frame ${_profileFrameNumber.toString().padRight(7)} ${frameTimeStampDescription.toString().padLeft(18)} ▄▄▄▄▄▄▄▄';
if (debugPrintBeginFrameBanner) if (debugPrintBeginFrameBanner)
debugPrint(_debugBanner); debugPrint(_debugBanner);
} }
...@@ -967,6 +961,10 @@ mixin SchedulerBinding on BindingBase, ServicesBinding { ...@@ -967,6 +961,10 @@ mixin SchedulerBinding on BindingBase, ServicesBinding {
} finally { } finally {
_schedulerPhase = SchedulerPhase.idle; _schedulerPhase = SchedulerPhase.idle;
Timeline.finishSync(); // end the Frame Timeline.finishSync(); // end the Frame
if (!kReleaseMode) {
_profileFrameStopwatch.stop();
_profileFramePostEvent();
}
assert(() { assert(() {
if (debugPrintEndFrameBanner) if (debugPrintEndFrameBanner)
debugPrint('▀' * _debugBanner.length); debugPrint('▀' * _debugBanner.length);
...@@ -977,13 +975,11 @@ mixin SchedulerBinding on BindingBase, ServicesBinding { ...@@ -977,13 +975,11 @@ mixin SchedulerBinding on BindingBase, ServicesBinding {
} }
} }
void _profileFramePostEvent(int frameNumber, FrameTiming frameTiming) { void _profileFramePostEvent() {
postEvent('Flutter.Frame', <String, dynamic>{ postEvent('Flutter.Frame', <String, dynamic>{
'number': frameNumber, 'number': _profileFrameNumber,
'startTime': frameTiming.timestampInMicroseconds(FramePhase.buildStart), 'startTime': _currentFrameTimeStamp.inMicroseconds,
'elapsed': frameTiming.totalSpan.inMicroseconds, 'elapsed': _profileFrameStopwatch.elapsedMicroseconds,
'build': frameTiming.buildDuration.inMicroseconds,
'raster': frameTiming.rasterDuration.inMicroseconds,
}); });
} }
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:async'; import 'dart:async';
import 'dart:ui' show window, FrameTiming;
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
...@@ -11,18 +10,7 @@ import 'package:flutter/services.dart'; ...@@ -11,18 +10,7 @@ import 'package:flutter/services.dart';
import '../flutter_test_alternative.dart'; import '../flutter_test_alternative.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>>>{};
@override
void postEvent(String eventKind, Map<dynamic, dynamic> eventData) {
getEventsDispatched(eventKind).add(eventData);
}
List<Map<String, dynamic>> getEventsDispatched(String eventKind) {
return eventsDispatched.putIfAbsent(eventKind, () => <Map<String, dynamic>>[]);
}
}
class TestStrategy { class TestStrategy {
int allowedPriority = 10000; int allowedPriority = 10000;
...@@ -33,8 +21,7 @@ class TestStrategy { ...@@ -33,8 +21,7 @@ class TestStrategy {
} }
void main() { void main() {
TestSchedulerBinding scheduler; SchedulerBinding scheduler;
setUpAll(() { setUpAll(() {
scheduler = TestSchedulerBinding(); scheduler = TestSchedulerBinding();
}); });
...@@ -129,23 +116,4 @@ void main() { ...@@ -129,23 +116,4 @@ void main() {
expect(timerQueueTasks.length, 2); expect(timerQueueTasks.length, 2);
expect(taskExecuted, false); expect(taskExecuted, false);
}); });
test('Flutter.Frame event fired', () async {
window.onReportTimings(<FrameTiming>[FrameTiming(<int>[
// build start, build finish
10000, 15000,
// raster start, raster finish
16000, 20000,
])]);
final List<Map<String, dynamic>> events = scheduler.getEventsDispatched('Flutter.Frame');
expect(events, hasLength(1));
final Map<String, dynamic> event = events.first;
expect(event['number'], isNonNegative);
expect(event['startTime'], 10000);
expect(event['elapsed'], 10000);
expect(event['build'], 5000);
expect(event['raster'], 4000);
});
} }
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