Unverified Commit 744a1693 authored by Yegor's avatar Yegor Committed by GitHub

Add a benchmark that focuses on Paint object performance (#60939)

* Add a benchmark the focuses on Paint object performance
parent 9cbe1dcc
...@@ -10,9 +10,20 @@ import 'recorder.dart'; ...@@ -10,9 +10,20 @@ import 'recorder.dart';
/// ///
/// Measures the performance of the `drawRect` operation. /// Measures the performance of the `drawRect` operation.
class BenchDrawRect extends SceneBuilderRecorder { class BenchDrawRect extends SceneBuilderRecorder {
BenchDrawRect() : super(name: benchmarkName); /// A variant of the benchmark that uses the same [Paint] object for all rectangles.
///
/// This variant focuses on the performance of the `drawRect` method itself.
BenchDrawRect.staticPaint() : benchmarkPaint = false, super(name: benchmarkName);
/// A variant of the benchmark that creates a unique [Paint] for each rectangle.
///
/// Does not cache the [Paint] objects across frames, but generates new
/// objects every time. This variant of the benchmark focuses on construction
/// and transfer of paint data to the renderer.
BenchDrawRect.variablePaint() : benchmarkPaint = true, super(name: variablePaintBenchmarkName);
static const String benchmarkName = 'draw_rect'; static const String benchmarkName = 'draw_rect';
static const String variablePaintBenchmarkName = 'draw_rect_variable_paint';
/// Number of rows in the grid. /// Number of rows in the grid.
static const int kRows = 25; static const int kRows = 25;
...@@ -20,17 +31,42 @@ class BenchDrawRect extends SceneBuilderRecorder { ...@@ -20,17 +31,42 @@ class BenchDrawRect extends SceneBuilderRecorder {
/// Number of columns in the grid. /// Number of columns in the grid.
static const int kColumns = 40; static const int kColumns = 40;
/// Whether each cell should gets its own unique [Paint] value.
///
/// This is used to benchmark the efficiency of passing a large number of
/// paint objects to the rendering system.
final bool benchmarkPaint;
/// Counter used to offset the rendered rects to make them wobble. /// Counter used to offset the rendered rects to make them wobble.
/// ///
/// The wobbling is there so a human could visually verify that the benchmark /// The wobbling is there so a human could visually verify that the benchmark
/// is correctly pumping frames. /// is correctly pumping frames.
double wobbleCounter = 0; double wobbleCounter = 0;
static final Paint _staticPaint = Paint()..color = const Color.fromARGB(255, 255, 0, 0);
Paint makePaint(int row, int col) {
if (benchmarkPaint) {
final Paint paint = Paint();
final double rowRatio = row / kRows;
paint.color = Color.fromARGB(255, (255 * rowRatio).floor(), (255 * col / kColumns).floor(), 255);
paint.filterQuality = FilterQuality.values[(FilterQuality.values.length * rowRatio).floor()];
paint.strokeCap = StrokeCap.values[(StrokeCap.values.length * rowRatio).floor()];
paint.strokeJoin = StrokeJoin.values[(StrokeJoin.values.length * rowRatio).floor()];
paint.blendMode = BlendMode.values[(BlendMode.values.length * rowRatio).floor()];
paint.style = PaintingStyle.values[(PaintingStyle.values.length * rowRatio).floor()];
paint.strokeWidth = 1.0 + rowRatio;
paint.strokeMiterLimit = rowRatio;
return paint;
} else {
return _staticPaint;
}
}
@override @override
void onDrawFrame(SceneBuilder sceneBuilder) { void onDrawFrame(SceneBuilder sceneBuilder) {
final PictureRecorder pictureRecorder = PictureRecorder(); final PictureRecorder pictureRecorder = PictureRecorder();
final Canvas canvas = Canvas(pictureRecorder); final Canvas canvas = Canvas(pictureRecorder);
final Paint paint = Paint()..color = const Color.fromARGB(255, 255, 0, 0);
final Size windowSize = window.physicalSize; final Size windowSize = window.physicalSize;
final Size cellSize = Size( final Size cellSize = Size(
...@@ -44,7 +80,7 @@ class BenchDrawRect extends SceneBuilderRecorder { ...@@ -44,7 +80,7 @@ class BenchDrawRect extends SceneBuilderRecorder {
for (int col = 0; col < kColumns; col++) { for (int col = 0; col < kColumns; col++) {
canvas.drawRect( canvas.drawRect(
Offset((wobbleCounter - 5).abs(), 0) & rectSize, Offset((wobbleCounter - 5).abs(), 0) & rectSize,
paint, makePaint(row, col),
); );
canvas.translate(cellSize.width, 0); canvas.translate(cellSize.width, 0);
} }
......
...@@ -41,7 +41,8 @@ final Map<String, RecorderFactory> benchmarks = <String, RecorderFactory>{ ...@@ -41,7 +41,8 @@ final Map<String, RecorderFactory> benchmarks = <String, RecorderFactory>{
BenchCardInfiniteScroll.benchmarkName: () => BenchCardInfiniteScroll.forward(), BenchCardInfiniteScroll.benchmarkName: () => BenchCardInfiniteScroll.forward(),
BenchCardInfiniteScroll.benchmarkNameBackward: () => BenchCardInfiniteScroll.backward(), BenchCardInfiniteScroll.benchmarkNameBackward: () => BenchCardInfiniteScroll.backward(),
BenchClippedOutPictures.benchmarkName: () => BenchClippedOutPictures(), BenchClippedOutPictures.benchmarkName: () => BenchClippedOutPictures(),
BenchDrawRect.benchmarkName: () => BenchDrawRect(), BenchDrawRect.benchmarkName: () => BenchDrawRect.staticPaint(),
BenchDrawRect.variablePaintBenchmarkName: () => BenchDrawRect.variablePaint(),
BenchPathRecording.benchmarkName: () => BenchPathRecording(), BenchPathRecording.benchmarkName: () => BenchPathRecording(),
BenchTextOutOfPictureBounds.benchmarkName: () => BenchTextOutOfPictureBounds(), BenchTextOutOfPictureBounds.benchmarkName: () => BenchTextOutOfPictureBounds(),
BenchSimpleLazyTextScroll.benchmarkName: () => BenchSimpleLazyTextScroll(), BenchSimpleLazyTextScroll.benchmarkName: () => BenchSimpleLazyTextScroll(),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment