Fix performance regression in Image construction.
authorGunnar Sletta <gunnar.sletta@jollamobile.com>
Sun, 7 Jun 2015 10:30:20 +0000 (12:30 +0200)
committerGunnar Sletta <gunnar@sletta.org>
Mon, 8 Jun 2015 06:38:24 +0000 (06:38 +0000)
Setting up the signal leads to a significant memory and performance
overhead. This patch improves the benchmark by almost 10%.

Change-Id: Ib0a76ba42fdce1ca707044a8f8b6bdc6405f20c3
Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
src/quick/items/qquickimage.cpp
src/quick/items/qquickimage_p.h
src/quick/items/qquickimagebase.cpp
src/quick/items/qquickimagebase_p.h

index f0f17551b711aa706e9d9314ba14e59a7725dd98..3ba09f9ceae11fc43b272c06db6f5c125bf32ba4 100644 (file)
@@ -152,7 +152,6 @@ QQuickImagePrivate::QQuickImagePrivate()
 QQuickImage::QQuickImage(QQuickItem *parent)
     : QQuickImageBase(*(new QQuickImagePrivate), parent)
 {
-    connect(this, SIGNAL(autoTransformBaseChanged()), SIGNAL(autoTransformChanged()));
 }
 
 QQuickImage::QQuickImage(QQuickImagePrivate &dd, QQuickItem *parent)
index 5b1aea59408af570f6b09b831a61a51c00281590..8edf153ca34ca199404ea6f1c9c3d77c97e780e0 100644 (file)
@@ -88,6 +88,8 @@ public:
     bool mipmap() const;
     void setMipmap(bool use);
 
+    virtual void emitAutoTransformBaseChanged() { emit autoTransformChanged(); }
+
 Q_SIGNALS:
     void fillModeChanged();
     void paintedGeometryChanged();
index 0e2134842b54efd7c82d1d7119305c98c1615c7e..223cb8f46f4983ddc6d6a9863188fccc1fe4e7b9 100644 (file)
@@ -197,7 +197,7 @@ void QQuickImageBase::load()
         }
         if (autoTransform() != d->oldAutoTransform) {
             d->oldAutoTransform = autoTransform();
-            emit autoTransformBaseChanged();
+            emitAutoTransformBaseChanged();
         }
         update();
 
@@ -284,7 +284,7 @@ void QQuickImageBase::requestFinished()
     }
     if (autoTransform() != d->oldAutoTransform) {
         d->oldAutoTransform = autoTransform();
-        emit autoTransformBaseChanged();
+        emitAutoTransformBaseChanged();
     }
     update();
 }
@@ -390,7 +390,7 @@ void QQuickImageBase::setAutoTransform(bool transform)
     if (d->autoTransform != UsePluginDefault && transform == (d->autoTransform == ApplyTransform))
         return;
     d->autoTransform = transform ? ApplyTransform : DoNotApplyTransform;
-    emit autoTransformBaseChanged();
+    emitAutoTransformBaseChanged();
 }
 
 QT_END_NAMESPACE
index d43822bebe5c081e9f6a4d9f4c2e82a755bf335c..4fcfaecd7d71698af0413a22359768a810a96aac 100644 (file)
@@ -83,6 +83,10 @@ public:
 
     void resolve2xLocalFile(const QUrl &url, qreal targetDevicePixelRatio, QUrl *sourceUrl, qreal *sourceDevicePixelRatio);
 
+    // Use a virtual rather than a signal->signal to avoid the huge
+    // connect/conneciton overhead for this rare case.
+    virtual void emitAutoTransformBaseChanged() { }
+
 Q_SIGNALS:
     void sourceChanged(const QUrl &);
     void sourceSizeChanged();
@@ -91,7 +95,6 @@ Q_SIGNALS:
     void asynchronousChanged();
     void cacheChanged();
     void mirrorChanged();
-    void autoTransformBaseChanged();
 
 protected:
     virtual void load();