mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

This patch adds a default shader warm up process which moves shader compilation from the animation time to the startup time. This also provides an extension for `runApp` so developers can customize the warm up process. This should reduce our worst_frame_rasterizer_time_millis from ~100ms to ~20-30ms for both flutter_gallery and complex_layout benchmarks. Besides, this should also have a significant improvement on 90th and 99th percentile time (50%-100% speedup in some cases, but I haven't tested them thoroughly; I'll let our device lab collect the data afterwards). The tradeoff the is the startup time (time to first frame). Our `flutter run --profile --trace-startup` seems to be a little noisy and I see about 100ms-200ms increase in that measurement for complex_layout and flutter_gallery. Note that this only happens on the first run after install or data wipe. Later the Skia persistent cache will remove the overhead. This also adds a cubic_bezier benchmark to test the custom shader warm up process. This should fix https://github.com/flutter/flutter/issues/813 (either by `defaultShaderWarmUp`, or a `customShaderWarmUp`).
56 lines
1.5 KiB
Dart
56 lines
1.5 KiB
Dart
// Copyright 2015 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'common.dart';
|
|
import 'src/cubic_bezier.dart';
|
|
import 'src/cull_opacity.dart';
|
|
|
|
const String kMacrobenchmarks ='Macrobenchmarks';
|
|
|
|
void main() => runApp(MacrobenchmarksApp());
|
|
|
|
class MacrobenchmarksApp extends StatelessWidget {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaterialApp(
|
|
title: kMacrobenchmarks,
|
|
initialRoute: '/',
|
|
routes: <String, WidgetBuilder>{
|
|
'/': (BuildContext context) => HomePage(),
|
|
kCullOpacityRouteName: (BuildContext context) => CullOpacityPage(),
|
|
kCubicBezierRouteName: (BuildContext context) => CubicBezierPage(),
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
class HomePage extends StatelessWidget {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(title: const Text(kMacrobenchmarks)),
|
|
body: ListView(
|
|
children: <Widget>[
|
|
RaisedButton(
|
|
key: const Key(kCullOpacityRouteName),
|
|
child: const Text('Cull opacity'),
|
|
onPressed: (){
|
|
Navigator.pushNamed(context, kCullOpacityRouteName);
|
|
},
|
|
),
|
|
RaisedButton(
|
|
key: const Key(kCubicBezierRouteName),
|
|
child: const Text('Cubic Bezier'),
|
|
onPressed: (){
|
|
Navigator.pushNamed(context, kCubicBezierRouteName);
|
|
},
|
|
)
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|