Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1646)

Side by Side Diff: bench/PictureRecordBench.cpp

Issue 698163004: PictureRecordBench's benchmarks are no longer relevant with SkRecord. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | gyp/bench.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7 #include "Benchmark.h"
8 #include "SkCanvas.h"
9 #include "SkColor.h"
10 #include "SkPaint.h"
11 #include "SkPicture.h"
12 #include "SkPictureRecorder.h"
13 #include "SkPoint.h"
14 #include "SkRandom.h"
15 #include "SkRect.h"
16 #include "SkString.h"
17
18 class PictureRecordBench : public Benchmark {
19 public:
20 PictureRecordBench(const char name[]) {
21 fName.printf("picture_record_%s", name);
22 }
23
24 virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
25 return backend == kNonRendering_Backend;
26 }
27
28 enum {
29 PICTURE_WIDTH = 1000,
30 PICTURE_HEIGHT = 4000,
31 };
32 protected:
33 virtual const char* onGetName() SK_OVERRIDE {
34 return fName.c_str();
35 }
36 private:
37 SkString fName;
38 typedef Benchmark INHERITED;
39 };
40
41
42 static const int kMaxLoopsPerCanvas = 10000;
43
44 /*
45 * An SkPicture has internal dictionaries to store bitmaps, matrices, paints,
46 * and regions. This bench populates those dictionaries to test the speed of
47 * reading and writing to those particular dictionary data structures.
48 */
49 class DictionaryRecordBench : public PictureRecordBench {
50 public:
51 DictionaryRecordBench() : INHERITED("dictionaries") {}
52
53 protected:
54 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
55 SkPictureRecorder recorder;
56 SkCanvas* canvas = recorder.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT );
57
58 const SkPoint translateDelta = getTranslateDelta(loops);
59
60 for (int i = 0; i < loops; i++) {
61 if (0 == i % kMaxLoopsPerCanvas) {
62 SkAutoTUnref<SkPicture> picture(recorder.endRecording());
63 canvas = recorder.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT);
64 }
65
66 SkColor color = SK_ColorYELLOW + (i % 255);
67 SkIRect rect = SkIRect::MakeWH(i % PICTURE_WIDTH, i % PICTURE_HEIGHT );
68
69 canvas->save();
70
71 // set the clip to the given region
72 SkRegion region;
73 region.setRect(rect);
74 canvas->clipRegion(region);
75
76 // fill the clip with a color
77 SkPaint paint;
78 paint.setColor(color);
79 canvas->drawPaint(paint);
80
81 // set a matrix on the canvas
82 SkMatrix matrix;
83 matrix.setRotate(SkIntToScalar(i % 360));
84 canvas->setMatrix(matrix);
85
86 // create a simple bitmap
87 SkBitmap bitmap;
88 bitmap.allocPixels(SkImageInfo::Make(10, 10,
89 kRGB_565_SkColorType, kOpaque_S kAlphaType));
90
91 // draw a single color into the bitmap
92 SkCanvas bitmapCanvas(bitmap);
93 bitmapCanvas.drawColor(SkColorSetA(color, i % 255));
94
95 // draw the bitmap onto the canvas
96 canvas->drawBitmapMatrix(bitmap, matrix);
97
98 canvas->restore();
99 canvas->translate(translateDelta.fX, translateDelta.fY);
100 }
101 SkAutoTUnref<SkPicture> cleanup(recorder.endRecording());
102 }
103
104 SkPoint getTranslateDelta(int M) {
105 SkIPoint canvasSize = onGetSize();
106 return SkPoint::Make(SkIntToScalar((PICTURE_WIDTH - canvasSize.fX)/M),
107 SkIntToScalar((PICTURE_HEIGHT- canvasSize.fY)/M));
108 }
109 private:
110 typedef PictureRecordBench INHERITED;
111 };
112
113 /*
114 * Populates the SkPaint dictionary with a large number of unique paint
115 * objects that differ only by color
116 */
117 class UniquePaintDictionaryRecordBench : public PictureRecordBench {
118 public:
119 UniquePaintDictionaryRecordBench() : INHERITED("unique_paint_dictionary") { }
120
121 protected:
122 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
123 SkRandom rand;
124 SkPaint paint;
125 SkPictureRecorder recorder;
126 SkCanvas* canvas = recorder.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT );
127 for (int i = 0; i < loops; i++) {
128 if (0 == i % kMaxLoopsPerCanvas) {
129 SkAutoTUnref<SkPicture> picture(recorder.endRecording());
130 canvas = recorder.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT);
131 }
132 paint.setColor(rand.nextU());
133 canvas->drawPaint(paint);
134 }
135 SkAutoTUnref<SkPicture> cleanup(recorder.endRecording());
136 }
137
138 private:
139 typedef PictureRecordBench INHERITED;
140 };
141
142 /*
143 * Populates the SkPaint dictionary with a number of unique paint
144 * objects that get reused repeatedly.
145 *
146 * Re-creating the paint objects in the inner loop slows the benchmark down 10% .
147 * Using setColor(i % objCount) instead of a random color creates a very high r ate
148 * of hash conflicts, slowing us down 12%.
149 */
150 class RecurringPaintDictionaryRecordBench : public PictureRecordBench {
151 public:
152 RecurringPaintDictionaryRecordBench() : INHERITED("recurring_paint_dictionar y") {
153 SkRandom rand;
154 for (int i = 0; i < ObjCount; i++) {
155 fPaint[i].setColor(rand.nextU());
156 }
157 }
158
159 enum {
160 ObjCount = 100, // number of unique paint objects
161 };
162 protected:
163 virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE {
164 SkPictureRecorder recorder;
165 SkCanvas* canvas = recorder.beginRecording(PICTURE_WIDTH, PICTURE_HEIGHT , NULL, 0);
166 for (int i = 0; i < loops; i++) {
167 canvas->drawPaint(fPaint[i % ObjCount]);
168 }
169 }
170
171 private:
172 SkPaint fPaint [ObjCount];
173 typedef PictureRecordBench INHERITED;
174 };
175
176 ///////////////////////////////////////////////////////////////////////////////
177
178 DEF_BENCH( return new DictionaryRecordBench(); )
179 DEF_BENCH( return new UniquePaintDictionaryRecordBench(); )
180 DEF_BENCH( return new RecurringPaintDictionaryRecordBench(); )
OLDNEW
« no previous file with comments | « no previous file | gyp/bench.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698