blob: bcdcb40b3da22fcc68a7ac19450d0869c64f5702 [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:math' as math;
import 'dart:ui';
import 'recorder.dart';
/// Draws many pictures in a grid with only the middle picture visible on the
/// screen, all others are clipped out, for example:
///
/// +-------------+-------------+-------------+---...
/// | | | |
/// | invisible | invisible | invisible |
/// | | | |
/// +-----------------------------------------+---...
/// | | | |
/// | invisible | invisible | invisible |
/// | | | |
/// +-----------------------------------------+---...
/// | | | |
/// | invisible | invisible | VISIBLE |
/// | | | |
/// +-------------+-------------+-------------+---...
/// | | | |
/// : : : :
///
/// We used to unnecessarily allocate DOM nodes, consuming memory and CPU time.
class BenchClippedOutPictures extends SceneBuilderRecorder {
BenchClippedOutPictures() : super(name: benchmarkName);
static const String benchmarkName = 'clipped_out_pictures';
static final Paint paint = Paint();
double angle = 0.0;
static const int kRows = 20;
static const int kColumns = 20;
@override
void onDrawFrame(SceneBuilder sceneBuilder) {
final Size screenSize = window.physicalSize / window.devicePixelRatio;
final Size pictureSize = Size(
screenSize.width / kColumns,
screenSize.height / kRows,
);
// Fills a single cell with random text.
void fillCell(int row, int column) {
sceneBuilder.pushOffset(
column * pictureSize.width,
row * pictureSize.height,
);
final PictureRecorder pictureRecorder = PictureRecorder();
final Canvas canvas = Canvas(pictureRecorder);
canvas.save();
canvas.drawCircle(Offset(pictureSize.width / 2, pictureSize.height / 2), 5.0, paint);
canvas.drawRect(Rect.fromCenter(
center: Offset(pictureSize.width / 2, pictureSize.height / 2),
width: pictureSize.width / 6,
height: pictureSize.height / 6,
), paint);
canvas.restore();
final Picture picture = pictureRecorder.endRecording();
sceneBuilder.addPicture(Offset.zero, picture);
sceneBuilder.pop();
}
// Starting with the top-left cell, fill every cell.
sceneBuilder.pushClipRect(Rect.fromCircle(
center: Offset(screenSize.width / 2, screenSize.height / 2),
radius: math.min(screenSize.width, screenSize.height) / 6,
));
sceneBuilder.pushOffset(
5.0 * math.cos(angle),
5.0 * math.sin(angle),
);
angle += math.pi / 20;
for (int row = 0; row < 10; row++) {
for (int column = 0; column < 10; column++) {
fillCell(row, column);
}
}
sceneBuilder.pop();
sceneBuilder.pop();
}
}