| /* | |
| * 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); ) |