diff options
author | Gunnar Sletta <gunnar@sletta.org> | 2014-09-02 11:49:50 +0200 |
---|---|---|
committer | Gunnar Sletta <gunnar@sletta.org> | 2014-09-03 09:16:14 +0200 |
commit | 0de680c8e8fab36e386dca35e5008ffaa27e8ef6 (patch) | |
tree | 36ef99752bd8f255d89d9a6f3635655dd857e94e /tests/auto/quick/qquickitem/tst_qquickitem.cpp | |
parent | 978ecab8b5dc20384cb449e05d58293f96722c0e (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.cpp | 21 |
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); |