
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`).
41 lines
1.4 KiB
Dart
41 lines
1.4 KiB
Dart
// Copyright 2018 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 'dart:ui';
|
|
|
|
import 'package:flutter_driver/driver_extension.dart';
|
|
import 'package:flutter/painting.dart' show DefaultShaderWarmUp, PaintingBinding;
|
|
import 'package:macrobenchmarks/main.dart' as app;
|
|
|
|
class CubicBezierShaderWarmUp extends DefaultShaderWarmUp {
|
|
@override
|
|
void warmUpOnCanvas(Canvas canvas) {
|
|
super.warmUpOnCanvas(canvas);
|
|
|
|
// Warm up the cubic shaders used by CubicBezierPage.
|
|
//
|
|
// This tests that our custom shader warm up is working properly.
|
|
// Without this custom shader warm up, the worst frame time is about 115ms.
|
|
// With this, the worst frame time is about 70ms. (Data collected on a Moto
|
|
// G4 based on Flutter version 704814c67a874077710524d30412337884bf0254.
|
|
final Path path = Path();
|
|
path.moveTo(20.0, 20.0);
|
|
// This cubic path is based on
|
|
// https://skia.org/user/api/SkPath_Reference#SkPath_cubicTo
|
|
path.cubicTo(300.0, 80.0, -140.0, 90.0, 220.0, 10.0);
|
|
final Paint paint = Paint();
|
|
paint.isAntiAlias = true;
|
|
paint.strokeWidth = 18.0;
|
|
paint.style = PaintingStyle.stroke;
|
|
paint.strokeCap = StrokeCap.round;
|
|
canvas.drawPath(path, paint);
|
|
}
|
|
}
|
|
|
|
void main() {
|
|
PaintingBinding.shaderWarmUp = CubicBezierShaderWarmUp();
|
|
enableFlutterDriverExtension();
|
|
app.main();
|
|
}
|