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