[Interest] Few questions regarding Qt Quick Scene Graph

Artem Fedoskin afedoskin3 at gmail.com
Mon Apr 25 19:46:15 CEST 2016


Thank you for your reply Gunnar,

Can you please tell me - can I store a pointer to the object of external
class (even not a QQuickItem derived one) in QSGNode derived class? Each
object of the class Data is associated with corresponding Triangle in View.
Whenever View is updated, it checks in loop Data objects on special
condition and based on that sets the corresponding Triangle to visible or
invisible state. If Triangle is visible, Triangle itself calls a bunch of
functions from external classes and uses pointer on object Data to retrieve
Data's info about coordinates then accesses function from another class to
convert the received coordinates to x,y positions.

I understand that it is not safe to access QSGNode not from updatePaintNode(),
but is it actually safe to access other classes from QSGNode itself? How
far can I go in QSGNode in accessing things in GUI thread?

Could you please also tell me - what is the way to hide QSGNode explicitly
like for example setting QQuickItem::visible property to false. I found
your E-Mail here
http://lists.qt-project.org/pipermail/interest/2015-February/015285.html
but I'm afraid that deallocating and allocating QSGNode will take
unnecessary overhead as the visibility of nodes in my app will be often
turned off/on. Is it a good idea to use QSGNode::removeChildNode() for this?

How do you think - maybe instead of allocating directly QSGNodes I should
just subclass instance of Data from QQuickItem and set its visual parent to
View? Is allocating 1000 QSGNodes in View significantly faster than
creating 1000 QQuickItems with the same painting logic and then setting its
visual parent to View?

Thank you

Regards,
Artem

2016-04-25 9:06 GMT+02:00 Gunnar Sletta <gunnar at sletta.org>:

>
> > On 24 Apr 2016, at 16:49, Artem Fedoskin <afedoskin3 at gmail.com> wrote:
> >
> > I'm sorry. My first E-Mail was sent accidentally. Here is the final
> version of my E-Mail.
> > Hello everybody. I have a project where a lot of objects are painted on
> the screen whenever the user interacts with the app (pan, zoom, move) I
> would be really grateful to you if you could answer a few questions
> regarding the internals of Qt Quick Scene Graph:
> >
> >       • Imagine that I add 1000 nodes with the same color inside
> QQuickItem::updatePaintNode() function of some QQuickItem derived class.
> Will they be drawn in batch as described in
> http://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph-renderer.html#batching
> ?
>
> Depends on the cirucmstances, but if they share clipping their
> QSGMaterial::compare() indicates they are all identical, they will be
> batched, yes. Verify with QSG_VISUALIZE=batches, as indicated by this same
> document.
>
> >       • Can I call the function of some other class in
> QQuickItem::updatePaintNode()? I have some class named Data, class named
> View and a subclass of QSGGeometryNode Triangle. Imagine that after objects
> of these classes are created the Data asks View to create 10 Triangles. The
> View creates 10 Triangles during the updatePaintNode() call and passes to
> them pointers to the object of class Data, that required their
> instantiation. The Triangles refers to the Data and get some values from it
> and converts them to x,y coordinates. Is it something possible?
> > Do I violate the rule stated here
> http://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html#scene-graph-and-rendering
> "Warning: It is crucial that OpenGL operations and interaction with the
> scene graph happens exclusively on the render thread, primarily during the
> updatePaintNode() call. The rule of thumb is to only use classes with the
> "QSG" prefix inside the QQuickItem::updatePaintNode() function." ?
>
> The point here is really that on many systems, there will be two threads
> that are running. The GUI thread where your QQuickItems live and the render
> thread where your QSGXxx objects live. updatePaintNode() is called on the
> render thread while the GUI thread is blocked, so you are safe to read
> state out of the QQuickItem at that time and use that to
> create/update/modify/delete your QSGXxx objects accordingly. At any other
> time, the two worlds live separate lives and should have no connection.
>
> There are other places where interaction between the threads are also ok,
> as outlined in the QQuickItem docs, but by sticking to the rule outlined in
> the updatePaintNode() function, 99% of all usecases will be covered.
>
> For your usecase you are free to construct View, Data, x number of
> Triangles during updatePaintNode() and then store that under some subclass
> of a QSGNode. On the next call,  you can update your structure if needed.
> Your QQuickItem does not store a pointer to this QSGNode, it only exists
> inside the scene graph and during the updatePaintNode() function.
>
> cheers,
> Gunnar
>
> >
> > At first I was thinking about deriving classes like Triangle from
> QQuickItem and then reparenting them to the View but the direct creation of
> QSGGeometryNodes seems to me to be less memory requiring approach.
> >
> > Regards,
> > Artem Fedoskin
> >
> > 2016-04-24 16:41 GMT+02:00 Artem Fedoskin <afedoskin3 at gmail.com>:
> > Hello everybody. I have a project where a lot of objects are painted on
> the screen whenever the user interacts with the app (pan, zoom, move) I
> would be really grateful to you if you could answer a few questions
> regarding the internals of Qt Quick Scene Graph:
> >
> >       • Imagine that I add 1000 nodes with the same color inside
> QQuickItem::updatePaintNode() function of some QQuickItem derived class.
> Will they be drawn in batch as described in
> http://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph-renderer.html#batching
> ?
> >       • Can I call the function of some other class in
> QQuickItem::updatePaintNode()? I have some class named Data, class named
> View and a subclass of QSGGeometryNode Triangle. Imagine that after objects
> of these classes are created the Data asks View to create 10 Triangles. The
> View creates 10 Triangles during the updatePaintNode() call and passes
> pointers to the object of class Data, that required their instantiation.
> The Triangles refers to the Data and get coordinates from it. Is it
> something possible. Do I violate the rule stated here "Warning: It is
> crucial that OpenGL operations and interaction with the scene graph happens
> exclusively on the render thread, primarily during the updatePaintNode()
> call. The rule of thumb is to only use classes with the "QSG" prefix inside
> the QQuickItem::updatePaintNode() function."
> >
> >
> >
> >       • For example, I want to get new coordinates of the object and to
> do that I should refer to function of some other not QSGNode derived object
> and then use these coordinates for rendering one of the nodes.
> >
> > _______________________________________________
> > Interest mailing list
> > Interest at qt-project.org
> > http://lists.qt-project.org/mailman/listinfo/interest
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20160425/ce8d7135/attachment.html>


More information about the Interest mailing list