aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/quick/qquickitem/tst_qquickitem.cpp
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar@sletta.org>2014-09-02 11:49:50 +0200
committerGunnar Sletta <gunnar@sletta.org>2014-09-03 09:16:14 +0200
commit0de680c8e8fab36e386dca35e5008ffaa27e8ef6 (patch)
tree36ef99752bd8f255d89d9a6f3635655dd857e94e /tests/auto/quick/qquickitem/tst_qquickitem.cpp
parent978ecab8b5dc20384cb449e05d58293f96722c0e (diff)
Fix performance regression caused by SG signals in QQuickItem.
For a testcase with thosands of items, I measured an increase in shutdown time from 800ms to 7500ms, all spent in disconnect(). This is not acceptible, so we're choosing a different approach. If items implement a invalidateSceneGraph slot, this function will be called during shutdown. It should be made a proper virtual in Qt 6. This approach costs very little. Change-Id: I5970143cc0a0744955687e17586f0bb00c9afb26 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'tests/auto/quick/qquickitem/tst_qquickitem.cpp')
-rw-r--r--tests/auto/quick/qquickitem/tst_qquickitem.cpp21
1 files changed, 13 insertions, 8 deletions
diff --git a/tests/auto/quick/qquickitem/tst_qquickitem.cpp b/tests/auto/quick/qquickitem/tst_qquickitem.cpp
index 38dc8e0ac4..0ce0ded28b 100644
--- a/tests/auto/quick/qquickitem/tst_qquickitem.cpp
+++ b/tests/auto/quick/qquickitem/tst_qquickitem.cpp
@@ -165,7 +165,7 @@ private slots:
void visualParentOwnership();
void visualParentOwnershipWindow();
- void testSGInitializeAndInvalidate();
+ void testSGInvalidate();
void objectChildTransform();
@@ -1880,30 +1880,35 @@ void tst_qquickitem::visualParentOwnershipWindow()
}
}
-void tst_qquickitem::testSGInitializeAndInvalidate()
+class InvalidatedItem : public QQuickItem {
+ Q_OBJECT
+signals:
+ void invalidated();
+public slots:
+ void invalidateSceneGraph() { emit invalidated(); }
+};
+
+void tst_qquickitem::testSGInvalidate()
{
for (int i=0; i<2; ++i) {
QScopedPointer<QQuickView> view(new QQuickView());
- QQuickItem *item = new QQuickItem();
+ InvalidatedItem *item = new InvalidatedItem();
- int expected;
+ int expected = 0;
if (i == 0) {
// First iteration, item has contents and should get signals
expected = 1;
item->setFlag(QQuickItem::ItemHasContents, true);
} else {
// Second iteration, item does not have content and will not get signals
- expected = 0;
}
- QSignalSpy initializeSpy(item, SIGNAL(sceneGraphInitialized()));
- QSignalSpy invalidateSpy(item, SIGNAL(sceneGraphInvalidated()));
+ QSignalSpy invalidateSpy(item, SIGNAL(invalidated()));
item->setParentItem(view->contentItem());
view->show();
QVERIFY(QTest::qWaitForWindowExposed(view.data()));
- QCOMPARE(initializeSpy.size(), expected);
delete view.take();
QCOMPARE(invalidateSpy.size(), expected);