blob: dc5caa50e7300a53e17cc46b5bf4d0c64c21f1bd [file] [log] [blame]
// Copyright 2014 The Flutter 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 'recorder.dart';
/// Measure the performance of paint bounds estimation by recording a picture
/// without actually rendering it.
///
/// Bounds estimation is done in two phases:
///
/// * As we call drawing methods on `Canvas` we grow bounds with every paint op.
/// * When we're done recording a picture we call `PictureRecorder.endRecording`
/// at which point we compute the overall picture bounds and cache the result.
///
/// This benchmarks puts emphasis on paint operations that trigger expensive
/// math such as `transformLTRB`. To do that we push non-identity transforms
/// and rotations before calling drawing methods.
class BenchPictureRecording extends RawRecorder {
BenchPictureRecording() : super(name: benchmarkName);
static const String benchmarkName = 'bench_picture_recording';
/// Cached paint used for drawing.
///
/// We want to avoid polluting the results with paint initialization logic.
late Paint paint;
/// A prelaid out and cached paragraph.
///
/// This is cached to remove text layout time from the benchmark time.
late Paragraph paragraph;
@override
Future<void> setUpAll() async {
paint = Paint();
paragraph = (ParagraphBuilder(ParagraphStyle())
..addText('abcd edfh ijkl mnop qrst uvwx yz'))
.build()
..layout(const ParagraphConstraints(width: 50));
}
@override
void body(Profile profile) {
final PictureRecorder recorder = PictureRecorder();
final Canvas canvas = Canvas(recorder);
profile.record('recordPaintCommands', () {
for (int i = 1; i <= 100; i++) {
canvas.translate((10 + i).toDouble(), (10 + i).toDouble());
canvas.save();
for (int j = 0; j < 10; j++) {
canvas.drawRect(const Rect.fromLTWH(10, 10, 10, 10), paint);
canvas.drawCircle(const Offset(50, 50), 50, paint);
canvas.rotate(1.0);
}
canvas.restore();
canvas.save();
for (int j = 0; j < 10; j++) {
canvas.translate(1, 1);
canvas.clipRect(Rect.fromLTWH(20, 20, 40 / i, 40));
canvas.drawRRect(RRect.fromRectAndRadius(const Rect.fromLTWH(10, 10, 10, 10), const Radius.circular(2)), paint);
canvas.drawParagraph(paragraph, Offset.zero);
}
canvas.restore();
}
}, reported: true);
profile.record('estimatePaintBounds', () {
recorder.endRecording();
}, reported: true);
}
}