liyuqian a44f174efc
Shader warm up (#27660)
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`).
2019-02-22 15:37:02 -08:00

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();
}