source: tests/blit/blit.cpp@ 436

Last change on this file since 436 was 436, checked in by Dmitry A. Kuminov, 15 years ago

tests: Added blit example to calculate the roundtrip speed of copying offscreen buffer to window during WM_PAINT.

File size: 3.0 KB
Line 
1#include <QDebug>
2
3#include <QtGui>
4
5/*
6 * This test calculates the roundtrip speed of copy offscreen buffer to window
7 * operations. Besides the time necessary for copying pixels, this also includes
8 * the time necessary to fill 2D rectangles in the offscreen buffer, deliver
9 * paint and timer messages and so on.
10 *
11 * To also get the speed of only the copy operatoins themselves, add
12 *
13 * #define QT_LOG_BLITSPEED
14 *
15 * to the beginning of qapplication_pm.cpp and qwindowsurface_raster.cpp.
16 *
17 * Hint: in order to get the most realistic numbers, let the test run until the
18 * average speed printed in the window title stabilizes (i.e. stops to grow).
19 **/
20
21////////////////////////////////////////////////////////////////////////////////
22
23class MyWidget : public QWidget
24{
25public:
26
27 MyWidget() : mUpdateTID(0), mStatTID(0), mNumPixels(0)
28 {
29 };
30
31 ~MyWidget()
32 {
33 unsigned long long elapsed = mElapsedTimer.elapsed();
34 qWarning() << "Stats:";
35 qWarning() << " total pixels blitted :" << mNumPixels;
36 qWarning() << " total time, ms :" << elapsed;
37 qWarning() << " average roundtrip speed, px/ms :" << mNumPixels / elapsed;
38 }
39
40 void startWork()
41 {
42 mElapsedTimer.start();
43 mUpdateTID = startTimer(0);
44 mStatTID = startTimer(500);
45 }
46
47 void paintEvent(QPaintEvent *aE)
48 {
49 QPainter p(this);
50
51 QRect r = aE->rect();
52
53 QColor c = QColor(rand() / (RAND_MAX / 255),
54 rand() / (RAND_MAX / 255),
55 rand() / (RAND_MAX / 255));
56 p.fillRect(r, c);
57
58 mNumPixels += r.width() * r.height();
59 }
60
61 void timerEvent(QTimerEvent *aE)
62 {
63 if (aE->timerId() == mUpdateTID) {
64 int w = width();
65 int h = height();
66 int x = w < 2 ? 0 : rand() / (RAND_MAX / (w - 1));
67 int y = h < 2 ? 0 : rand() / (RAND_MAX / (w - 1));
68 w -= x;
69 h -= y;
70 w = w < 2 ? 1 : rand() / (RAND_MAX / w);
71 h = h < 2 ? 1 : rand() / (RAND_MAX / h);
72
73 update(x, y, w, h);
74 } else if (aE->timerId() == mStatTID) {
75 unsigned long long elapsed = mElapsedTimer.elapsed();
76 QString title = QLatin1String("Blit Stats: %1 pixels/ms");
77 title = title.arg(mNumPixels / elapsed);
78 setWindowTitle(title);
79 }
80 }
81
82private:
83
84 int mUpdateTID;
85 int mStatTID;
86 unsigned long long mNumPixels;
87 QTime mElapsedTimer;
88};
89
90int main(int argc, char **argv)
91{
92 QApplication app(argc, argv);
93 app.setQuitOnLastWindowClosed(true);
94
95 srand(QDateTime::currentDateTime().toTime_t());
96
97 MyWidget widget;
98 widget.resize(300, 300);
99 widget.show();
100
101 QRect sr = QApplication::desktop()->availableGeometry();
102 QRect gr = widget.frameGeometry();
103 widget.move(sr.width() - gr.width(), sr.height() - gr.height());
104
105 widget.startWork();
106
107 if (!app.topLevelWidgets().isEmpty())
108 return app.exec();
109
110 return 0;
111}
112
Note: See TracBrowser for help on using the repository browser.