| /* |
| * Copyright 2015 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| // A benchmark designed to isolate the constant overheads of picture recording. |
| // We record an empty picture and a picture with one draw op to force memory allocation. |
| |
| #include "Benchmark.h" |
| #include "SkCanvas.h" |
| #include "SkLiteDL.h" |
| #include "SkLiteRecorder.h" |
| #include "SkPictureRecorder.h" |
| |
| template <int kDraws, bool kLite> |
| struct PictureOverheadBench : public Benchmark { |
| PictureOverheadBench() { |
| fName.appendf("picture_overhead_%d%s", kDraws, kLite ? "_lite" : ""); |
| } |
| const char* onGetName() override { return fName.c_str(); } |
| bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } |
| |
| void onDraw(int loops, SkCanvas*) override { |
| SkLiteRecorder lite; |
| SkPictureRecorder rec; |
| |
| SkIRect iBounds = {0,0, 2000,3000}; |
| SkRect bounds = SkRect::Make(iBounds); |
| |
| for (int i = 0; i < loops; i++) { |
| SkLiteDL liteDL; |
| SkCanvas* canvas; |
| if (kLite) { |
| lite.reset(&liteDL, iBounds); |
| canvas = &lite; |
| } else { |
| rec.beginRecording(bounds); |
| canvas = rec.getRecordingCanvas(); |
| } |
| |
| for (int i = 0; i < kDraws; i++) { |
| canvas->drawRect({10,10, 1000, 1000}, SkPaint{}); |
| } |
| |
| if (!kLite) { |
| (void)rec.finishRecordingAsPicture(); |
| } |
| } |
| } |
| |
| SkString fName; |
| }; |
| |
| DEF_BENCH(return (new PictureOverheadBench<0, false>);) |
| DEF_BENCH(return (new PictureOverheadBench<1, false>);) |
| DEF_BENCH(return (new PictureOverheadBench<2, false>);) |
| DEF_BENCH(return (new PictureOverheadBench<10,false>);) |
| DEF_BENCH(return (new PictureOverheadBench<0, true>);) |
| DEF_BENCH(return (new PictureOverheadBench<1, true>);) |
| DEF_BENCH(return (new PictureOverheadBench<2, true>);) |
| DEF_BENCH(return (new PictureOverheadBench<10, true>);) |
| |
| /////////////////////////////////////////////////////////////////////////////////////////////////// |
| |
| class ClipOverheadRecordingBench : public Benchmark { |
| SkString fName; |
| const bool fDoLite; |
| |
| public: |
| ClipOverheadRecordingBench(bool doLite) : fDoLite(doLite) { |
| fName.printf("clip_overhead_recording_%s", doLite ? "lite" : "std"); |
| } |
| |
| protected: |
| const char* onGetName() override { return fName.c_str(); } |
| bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } |
| |
| void onDraw(int loops, SkCanvas*) override { |
| SkLiteRecorder lite; |
| SkPictureRecorder rec; |
| |
| SkIRect iBounds = {0,0, 2000,3000}; |
| SkRect bounds = SkRect::Make(iBounds); |
| |
| for (int i = 0; i < loops; i++) { |
| SkLiteDL liteDL; |
| SkCanvas* canvas; |
| if (fDoLite) { |
| lite.reset(&liteDL, iBounds); |
| canvas = &lite; |
| } else { |
| rec.beginRecording(bounds); |
| canvas = rec.getRecordingCanvas(); |
| } |
| |
| SkPaint paint; |
| SkRRect rrect; |
| rrect.setOval({0, 0, 1000, 1000}); |
| for (int i = 0; i < 1000; i++) { |
| canvas->save(); |
| canvas->translate(10, 10); |
| canvas->clipRect({10,10, 1000, 1000}); |
| canvas->drawRRect(rrect, paint); |
| canvas->restore(); |
| } |
| |
| if (!fDoLite) { |
| (void)rec.finishRecordingAsPicture(); |
| } |
| } |
| } |
| }; |
| DEF_BENCH( return new ClipOverheadRecordingBench(true); ) |
| DEF_BENCH( return new ClipOverheadRecordingBench(false); ) |