[Qt-interest] QGraphicsView performance issue
Santhosh Y
santhosh at softjin.com
Mon May 11 17:09:44 CEST 2009
Alexis Ménard wrote:
> On Monday 11 May 2009 16:10:04 Santhosh Y wrote:
>
>> Please read my comments below
>>
>> Alexis Ménard wrote:
>>
>>> On Monday 11 May 2009 15:01:52 Santhosh Y wrote:
>>>
>>>> Santhosh Y wrote:
>>>>
>>>>> Hi,
>>>>>
>>> Hi,
>>>
>>>
>>>>> I added 30,000 items to the scene.
>>>>> While updating the scene, the response from the view is very slow.
>>>>>
>>>>> Among these 30,000 items only 3,000 items have the distinctive
>>>>> locations and the rest of 27,000 items have the same location of those
>>>>> 3,000 items.
>>>>>
>>>>> In such a scenario to improve the performance, what flags
>>>>> I should use on the scene to improve the performance.
>>>>>
>>> If the painting (paint method) is slow on items, you can use the cache
>>> mode, itemCoordinateCache if you have no transformations otherwise
>>> DeviceCoordinateCache.
>>>
>> I am not able to find the above flag for setting cache mode.
>> I am using 4.3.3 version of Qt.
>> I can use only cacheNone or cacheBackGround.
>>
>
> OoOooOOooooOOo. Then i fully encourage you to upgrade to 4.5. Lot of
> performance improvements has been made since 4.3.3 and those repaint bugs has
> been
> probably fixed. And you have more features.
>
Is 4.5 released for windows version.
>
>>> If you trigger full updates on the scene, then you need to set the
>>> viewportUpdate to fullviewport update because sometimes it is slower to
>>> caculate the exact dirty area than repainting the all scene (aka OpenGL).
>>>
>>>
>>>> To add to the above issue, what I have observed is that, paintEvent() on
>>>> QGraphicsview is being called multiple times
>>>> which is taking around 3 sec for each call to pick the items from the
>>>> visible region for sending to
>>>>
>>> That why we are working on an API to allow you to create your custom
>>> indexing where you can skip some parts of the scene or skipping items
>>> that you don't need.
>>>
>>>
>>>> QGraphicsScene::drawItems(QPainter* p, int numItems, QGraphicsItem**
>>>> items, const QStyleOptionGraphicsItem* options )
>>>> function dispatch.
>>>>
>>>> Can anybody tell me how to track from where this paintEvent call is
>>>> dispatched so many times.
>>>>
>>> recalculateContentSize can be the source of those calls because you query
>>> a full update (see below).
>>>
>>>
>>>> I have no QGraphicsView::update() calls in my code, but I have the
>>>> QGraphicsScene::update() calls.
>>>>
>>> Calling update on the scene is not a good idea unless you give a
>>> rectangle to update(). Without parameter it will redraw everything... Why
>>> do you need to update the whole scene? Updating the content should
>>> triggers updates on items for you...
>>>
>> I removed all the QGraphicsScene::update () calls. Still the performance
>> have not improved.
>>
>>
>>>> But none of the QGraphicsScene::update () call is immediately resulting
>>>> a QGraphicsView::paintEvent(QPaintEvent*)
>>>>
>>>> My observation is that all the mutliple calls on
>>>> QGraphicsView::paintEvent(QPaintEvent*) are resulting from the following
>>>> stack.
>>>> ------------------------------------------------------------------------
>>>> --- --------------------------- QGraphicsView::paintEvent(QPaintEvent *
>>>> e=0x0012b550) Line 1282 C++ QtGuid4.dll!QWidget::event(QEvent *
>>>> event=0x0012b550) Line 6256 C++ QtGuid4.dll!QFrame::event(QEvent *
>>>> e=0x0012b550) Line 641 C++
>>>> QtGuid4.dll!QAbstractScrollArea::viewportEvent(QEvent *
>>>> e=0x0012b550) Line 909 + 0xc bytes C++
>>>> QtGuid4.dll!QGraphicsView::viewportEvent(QEvent *
>>>> event=0x0012b550) Line 2324 C++
>>>> QtGuid4.dll!QAbstractScrollAreaPrivate::viewportEvent(QEvent *
>>>> event=0x0012b550) Line 78 + 0x28 bytes C++
>>>> QtGuid4.dll!QAbstractScrollAreaFilter::eventFilter(QObject *
>>>> o=0x08705aa0, QEvent * e=0x0012b550) Line 89 + 0x29 bytes C++
>>>> QtGuid4.dll!QApplicationPrivate::notify_helper(QObject *
>>>> receiver=0x08705aa0, QEvent * e=0x0012b550) Line 3533 + 0x1b bytes
>>>> C++ QtGuid4.dll!QApplication::notify(QObject * receiver=0x08705aa0,
>>>> QEvent * e=0x0012b550) Line 3482 + 0x10 bytes C++
>>>> QtCored4.dll!QCoreApplication::notifyInternal(QObject *
>>>> receiver=0x08705aa0, QEvent * event=0x0012b550) Line 516 C++
>>>> QtCored4.dll!QCoreApplication::sendSpontaneousEvent(QObject *
>>>> receiver=0x08705aa0, QEvent * event=0x0012b550) Line 188 + 0x38
>>>> bytes C++
>>>> QtGuid4.dll!qt_sendSpontaneousEvent(QObject * receiver=0x08705aa0,
>>>> QEvent * event=0x0012b550) Line 1182 + 0xe bytes C++
>>>> QtGuid4.dll!QWidgetPrivate::drawWidget(QPaintDevice *
>>>> pdev=0x02a0a878, const QRegion & rgn={...}, const QPoint & offset={...},
>>>> int flags=4) Line 1195 + 0xd bytes C++
>>>>
>>>> QtGuid4.dll!QWidgetBackingStore::paintSiblingsRecursive(QPaintDevice *
>>>> pdev=0x02a0a878, const QList<QObject *> & siblings={...}, int index=0,
>>>> const QRegion & rgn={...}, const QPoint & offset={...}, int flags=4)
>>>> Line 1099 C++
>>>> QtGuid4.dll!QWidgetPrivate::drawWidget(QPaintDevice *
>>>> pdev=0x02a0a878, const QRegion & rgn={...}, const QPoint & offset={...},
>>>> int flags=4) Line 1231 + 0x2e bytes C++
>>>>
>>>> QtGuid4.dll!QWidgetBackingStore::paintSiblingsRecursive(QPaintDevice *
>>>> pdev=0x02a0a878, const QList<QObject *> & siblings={...}, int index=2,
>>>> const QRegion & rgn={...}, const QPoint & offset={...}, int flags=4)
>>>> Line 1099 C++
>>>>
>>>> QtGuid4.dll!QWidgetBackingStore::paintSiblingsRecursive(QPaintDevice *
>>>> pdev=0x02a0a878, const QList<QObject *> & siblings={...}, int index=3,
>>>> const QRegion & rgn={...}, const QPoint & offset={...}, int flags=4)
>>>> Line 1089 + 0x20 bytes C++
>>>>
>>>> QtGuid4.dll!QWidgetBackingStore::paintSiblingsRecursive(QPaintDevice *
>>>> pdev=0x02a0a878, const QList<QObject *> & siblings={...}, int index=4,
>>>> const QRegion & rgn={...}, const QPoint & offset={...}, int flags=4)
>>>> Line 1089 + 0x20 bytes C++
>>>> QtGuid4.dll!QWidgetPrivate::drawWidget(QPaintDevice *
>>>> pdev=0x02a0a878, const QRegion & rgn={...}, const QPoint & offset={...},
>>>> int flags=4) Line 1231 + 0x2e bytes C++
>>>>
>>>> QtGuid4.dll!QWidgetBackingStore::paintSiblingsRecursive(QPaintDevice *
>>>> pdev=0x02a0a878, const QList<QObject *> & siblings={...}, int index=13,
>>>> const QRegion & rgn={...}, const QPoint & offset={...}, int flags=4)
>>>> Line 1099 C++
>>>> QtGuid4.dll!QWidgetPrivate::drawWidget(QPaintDevice *
>>>> pdev=0x02a0a878, const QRegion & rgn={...}, const QPoint & offset={...},
>>>> int flags=4) Line 1231 + 0x2e bytes C++
>>>>
>>>> QtGuid4.dll!QWidgetBackingStore::paintSiblingsRecursive(QPaintDevice *
>>>> pdev=0x02a0a878, const QList<QObject *> & siblings={...}, int index=5,
>>>> const QRegion & rgn={...}, const QPoint & offset={...}, int flags=4)
>>>> Line 1099 C++
>>>> QtGuid4.dll!QWidgetPrivate::drawWidget(QPaintDevice *
>>>> pdev=0x02a0a878, const QRegion & rgn={...}, const QPoint & offset={...},
>>>> int flags=4) Line 1231 + 0x2e bytes C++
>>>>
>>>> QtGuid4.dll!QWidgetBackingStore::paintSiblingsRecursive(QPaintDevice *
>>>> pdev=0x02a0a878, const QList<QObject *> & siblings={...}, int index=40,
>>>> const QRegion & rgn={...}, const QPoint & offset={...}, int flags=4)
>>>> Line 1099 C++
>>>>
>>>> QtGuid4.dll!QWidgetBackingStore::paintSiblingsRecursive(QPaintDevice *
>>>> pdev=0x02a0a878, const QList<QObject *> & siblings={...}, int index=41,
>>>> const QRegion & rgn={...}, const QPoint & offset={...}, int flags=4)
>>>> Line 1089 + 0x20 bytes C++
>>>>
>>>> QtGuid4.dll!QWidgetBackingStore::paintSiblingsRecursive(QPaintDevice *
>>>> pdev=0x02a0a878, const QList<QObject *> & siblings={...}, int index=42,
>>>> const QRegion & rgn={...}, const QPoint & offset={...}, int flags=4)
>>>> Line 1089 + 0x20 bytes C++
>>>> QtGuid4.dll!QWidgetPrivate::drawWidget(QPaintDevice *
>>>> pdev=0x02a0a878, const QRegion & rgn={...}, const QPoint & offset={...},
>>>> int flags=5) Line 1231 + 0x2e bytes C++
>>>> QtGuid4.dll!QWidgetBackingStore::cleanRegion(const QRegion &
>>>> rgn={...}, QWidget * widget=0x0012fd58, bool
>>>> recursiveCopyToScreen=false) Line 1000 C++
>>>> QtGuid4.dll!qt_syncBackingStore(QRegion rgn={...}, QWidget *
>>>> widget=0x0012fd58, bool recursive=false) Line 230 C++
>>>> QtGuid4.dll!QETWidget::translatePaintEvent(const tagMSG &
>>>> msg={...}) Line 3094 + 0x2b bytes C++
>>>> QtGuid4.dll!QtWndProc(HWND__ * hwnd=0x000a1118, unsigned int
>>>> message=15, unsigned int wParam=0, long lParam=0) Line 1680 + 0xc
>>>> bytes C++
>>>> ------------------------------------------------------------------------
>>>> --- ---------------------------
>>>>
>>>> Please tell me how to track the event call of paint over QGraphicsView.
>>>>
>
>
--
----------------------------------------------------
Y Santhosh Kumar
Senior Software Engineer
SoftJin Technologies Private Limited
Unit No. 102, Mobius Tower,
I Floor, SJR I - Park,
EPIP, White Field,
Bangalore - 560066, India
U : www.softjin.com
E : santhosh at softjin.com
T : +91-80-41779999
M : +91-9740535265
----------------------------------------------------
Business Disclaimer
____________________________________________________________
This e-mail message and any files transmitted with it are intended solely
for the use of the individual or entity to which they are addressed. It
may contain confidential, proprietary or legally privileged information.
If you are not the intended recipient please be advised that you have
received this message in error and any use is strictly prohibited. Please
immediately delete it and all copies of it from your system, destroy any
hard copies of it and notify the sender by return mail. You must not,
directly or indirectly, use, disclose, distribute, print, or copy any part of
this message if you are not the intended recipient.
___________________________________________________________
More information about the Qt-interest-old
mailing list