Nested picture nanobench
Measure picture overhead for recording & playback using a Sierpinski fractal (http://skfiddle.com/c/a2b6e60d775543b7c29a5d45d0371c02) with various picture nesting levels. R=mtklein@google.com, reed@google.com Author: fmalita@chromium.org Review URL: https://codereview.chromium.org/566393002
This commit is contained in:
parent
db26a1267d
commit
44162675ca
163
bench/PictureNestingBench.cpp
Normal file
163
bench/PictureNestingBench.cpp
Normal file
@ -0,0 +1,163 @@
|
||||
/*
|
||||
* Copyright 2014 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "Benchmark.h"
|
||||
#include "SkCanvas.h"
|
||||
#include "SkColor.h"
|
||||
#include "SkNullCanvas.h"
|
||||
#include "SkPaint.h"
|
||||
#include "SkPicture.h"
|
||||
#include "SkPictureRecorder.h"
|
||||
#include "SkString.h"
|
||||
|
||||
class PictureNesting : public Benchmark {
|
||||
public:
|
||||
PictureNesting(const char* name, int maxLevel, int maxPictureLevel)
|
||||
: fMaxLevel(maxLevel)
|
||||
, fMaxPictureLevel(maxPictureLevel) {
|
||||
|
||||
fPaint.setColor(SK_ColorRED);
|
||||
fPaint.setAntiAlias(true);
|
||||
fPaint.setStyle(SkPaint::kStroke_Style);
|
||||
fName.printf("picture_nesting_%s_%d", name,
|
||||
this->sierpinsky(SkCreateNullCanvas(), 0, fPaint));
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual const char* onGetName() SK_OVERRIDE {
|
||||
return fName.c_str();
|
||||
}
|
||||
|
||||
void doDraw(SkCanvas* canvas) {
|
||||
SkIPoint canvasSize = onGetSize();
|
||||
canvas->save();
|
||||
canvas->scale(SkIntToScalar(canvasSize.x()), SkIntToScalar(canvasSize.y()));
|
||||
|
||||
this->sierpinsky(canvas, 0, fPaint);
|
||||
|
||||
canvas->restore();
|
||||
}
|
||||
|
||||
int sierpinsky(SkCanvas* canvas, int lvl, const SkPaint& paint) {
|
||||
if (++lvl > fMaxLevel) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pics = 0;
|
||||
bool recordPicture = lvl <= fMaxPictureLevel;
|
||||
SkPictureRecorder recorder;
|
||||
SkCanvas* c = canvas;
|
||||
|
||||
if (recordPicture) {
|
||||
c = recorder.beginRecording(1, 1);
|
||||
pics++;
|
||||
}
|
||||
|
||||
c->drawLine(0.5, 0, 0, 1, paint);
|
||||
c->drawLine(0.5, 0, 1, 1, paint);
|
||||
c->drawLine(0, 1, 1, 1, paint);
|
||||
|
||||
c->save();
|
||||
c->scale(0.5, 0.5);
|
||||
|
||||
c->translate(0, 1);
|
||||
pics += this->sierpinsky(c, lvl, paint);
|
||||
|
||||
c->translate(1, 0);
|
||||
pics += this->sierpinsky(c, lvl, paint);
|
||||
|
||||
c->translate(-0.5, -1);
|
||||
pics += this->sierpinsky(c, lvl, paint);
|
||||
c->restore();
|
||||
|
||||
if (recordPicture) {
|
||||
SkAutoTUnref<SkPicture> picture(recorder.endRecording());
|
||||
canvas->drawPicture(picture);
|
||||
}
|
||||
|
||||
return pics;
|
||||
}
|
||||
|
||||
int fMaxLevel;
|
||||
int fMaxPictureLevel;
|
||||
|
||||
private:
|
||||
SkString fName;
|
||||
SkPaint fPaint;
|
||||
|
||||
typedef Benchmark INHERITED;
|
||||
};
|
||||
|
||||
class PictureNestingRecording : public PictureNesting {
|
||||
public:
|
||||
PictureNestingRecording(int maxLevel, int maxPictureLevel)
|
||||
: INHERITED("recording", maxLevel, maxPictureLevel) {
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void onDraw(const int loops, SkCanvas* canvas) {
|
||||
SkIPoint canvasSize = onGetSize();
|
||||
SkPictureRecorder recorder;
|
||||
|
||||
for (int i = 0; i < loops; i++) {
|
||||
SkCanvas* c = recorder.beginRecording(SkIntToScalar(canvasSize.x()),
|
||||
SkIntToScalar(canvasSize.y()));
|
||||
this->doDraw(c);
|
||||
SkAutoTUnref<SkPicture> picture(recorder.endRecording());
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
typedef PictureNesting INHERITED;
|
||||
};
|
||||
|
||||
class PictureNestingPlayback : public PictureNesting {
|
||||
public:
|
||||
PictureNestingPlayback(int maxLevel, int maxPictureLevel)
|
||||
: INHERITED("playback", maxLevel, maxPictureLevel) {
|
||||
|
||||
SkIPoint canvasSize = onGetSize();
|
||||
SkPictureRecorder recorder;
|
||||
SkCanvas* c = recorder.beginRecording(SkIntToScalar(canvasSize.x()),
|
||||
SkIntToScalar(canvasSize.y()));
|
||||
|
||||
this->doDraw(c);
|
||||
fPicture.reset(recorder.endRecording());
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void onDraw(const int loops, SkCanvas* canvas) {
|
||||
for (int i = 0; i < loops; i++) {
|
||||
canvas->drawPicture(fPicture);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
SkAutoTUnref<SkPicture> fPicture;
|
||||
|
||||
typedef PictureNesting INHERITED;
|
||||
};
|
||||
|
||||
DEF_BENCH( return new PictureNestingRecording(8, 0); )
|
||||
DEF_BENCH( return new PictureNestingRecording(8, 1); )
|
||||
DEF_BENCH( return new PictureNestingRecording(8, 2); )
|
||||
DEF_BENCH( return new PictureNestingRecording(8, 3); )
|
||||
DEF_BENCH( return new PictureNestingRecording(8, 4); )
|
||||
DEF_BENCH( return new PictureNestingRecording(8, 5); )
|
||||
DEF_BENCH( return new PictureNestingRecording(8, 6); )
|
||||
DEF_BENCH( return new PictureNestingRecording(8, 7); )
|
||||
DEF_BENCH( return new PictureNestingRecording(8, 8); )
|
||||
|
||||
DEF_BENCH( return new PictureNestingPlayback(8, 0); )
|
||||
DEF_BENCH( return new PictureNestingPlayback(8, 1); )
|
||||
DEF_BENCH( return new PictureNestingPlayback(8, 2); )
|
||||
DEF_BENCH( return new PictureNestingPlayback(8, 3); )
|
||||
DEF_BENCH( return new PictureNestingPlayback(8, 4); )
|
||||
DEF_BENCH( return new PictureNestingPlayback(8, 5); )
|
||||
DEF_BENCH( return new PictureNestingPlayback(8, 6); )
|
||||
DEF_BENCH( return new PictureNestingPlayback(8, 7); )
|
||||
DEF_BENCH( return new PictureNestingPlayback(8, 8); )
|
@ -75,6 +75,7 @@
|
||||
'../bench/PathIterBench.cpp',
|
||||
'../bench/PathUtilsBench.cpp',
|
||||
'../bench/PerlinNoiseBench.cpp',
|
||||
'../bench/PictureNestingBench.cpp',
|
||||
'../bench/PicturePlaybackBench.cpp',
|
||||
'../bench/PictureRecordBench.cpp',
|
||||
'../bench/PremulAndUnpremulAlphaOpsBench.cpp',
|
||||
|
Loading…
Reference in New Issue
Block a user