[Interest] Qt3D memory leaks

Sean Harmer sh at theharmers.co.uk
Thu Apr 13 11:02:30 CEST 2017


Hi,

On 13/04/2017 09:33, Igor Mironchik wrote:
> Hi,
>
>
> 13.04.2017 9:58, Sean Harmer пишет:
>> Hi,
>>
>> On 13/04/2017 07:09, Igor Mironchik wrote:
>>> Hello,
>>>
>>> 3Dtree has been updated. Now autumn is animated. Removed hand-made
>>> classes of leaf geometry and mesh. Now example uses ready mesh prepared
>>> in Blender. Modified a little constants of the tree. Example looks nice.
>>> This is a benchmark of your video card, because leafs and branches are
>>> stand alone objects (QEntity). For example 5 years tree has ~ 900
>>> objects. My Intel Pentium with Intel HD graphics normally paint only 5
>>> years tree, 6 years tree starts to slow down.
>>
>> Yes, at present each entity with a material/geometry renderer combo
>> gets translated to an OpenGL draw call. We are looking to add batching
>> (similar to how Qt Quick 2 works) but it's not there yet.
>>
>> If you don't need to address each individual leaf/branch in your
>> object model. E.g. if you're just rendering them, then you can get
>> *much* better performance by using instanced rendering.
>>
>> Essentially you have one entity representing all leaves. This entity
>> contains the material and geometry renderer as normal. The positions
>> and any other custom properties that vary between instances (rotation,
>> leaf size, leaf colour etc) should be placed into an additional
>> attribute/buffer and provided to the geometry renderer. On this
>> attribute, set the divisor property to 1 meaning that 1 piece of data
>> maps to 1 instance of the leave in the scene. With this approach you
>> will be able to render 10,000's leaves in a single draw call. It maps
>> through to a call to glDrawElementsInstanced() in case you want to
>> read up on it. Essentially you're moving the for loop over each leaf
>> on to the GPU.
>>
>> Typically, you'd have your data for the leaves in an array in C++ and
>> use this to populate the leaf instance buffer.
>
> Thank you Sean. Interesting technique. I read a little about it and
> looked at the OpenGL uses of such approach.
>
> But I have questions on how to implement this approach with Qt3D. I can
> set QAttribute to the QGeometryRenderer. If this attribute will have
> divisor = 1 then this attribute will affect only 1 instance. Cool, such
> I can use instancing.
>
> But I need to define attribute that will have QTransform matrix for
> transformation. And one attribute with diffuse colour. So 2 attributes
> per instance. Then leaves will be drawn instanced.
>
> And here I can't understand how to do it with Qt3D.
>
> Is it possible? Or I should do instancing in another way?
>
> I'm sorry for the noobs questions. And thank you again.
>
>>
>> The plan is to have a batcher that uses this instancing facility.
>
> It will be great. And with this batching my current code will render
> 10,000 leaves if I share a mesh only? Or material should be shared too?

See 
http://code.qt.io/cgit/qt/qt3d.git/tree/examples/qt3d/instanced-arrays-qml?h=5.9 
for an example of instancing.

You need to share the same geometry and same material for all instances 
in that entity. I'd suggest starting simple and just storing the 
position of each leaf in the per instance buffer/attribute to start with.

You will need a custom material as the built in materials don't support 
instancing out of the box - this is waiting on the shader generator that 
is in development at the moment.

Cheers,

Sean

>
>>
>> Cheers,
>>
>> Sean
>>
>>>
>>> And one more - now you can rotate the tree with the left mouse button.
>>>
>>>
>>> 11.04.2017 12:15, Igor Mironchik пишет:
>>>>
>>>> Hi,
>>>>
>>>> I fixed a little 3Dtree. Now branches positions are correct. And I
>>>> know that not all leafs is visible (this is because leaf geometry is
>>>> implemented as plain which renders only on one side).
>>>>
>>>>
>>>> 10.04.2017 13:20, Igor Mironchik пишет:
>>>>>
>>>>> Hello,
>>>>>
>>>>> I guess that Qt3D has huge memory leaks.
>>>>>
>>>>> You can check it on this example:
>>>>> https://github.com/igormironchik/3Dtree
>>>>>
>>>>> It's 3D tree, that grows year by year.
>>>>>
>>>>> By default tree will grow 5 years (5 minutes).
>>>>>
>>>>> When tree grown you can restart tree. And here I delete all resources:
>>>>>
>>>>> void
>>>>>
>>>>> MainWindowPrivate::createTree()
>>>>> {
>>>>> if(m_tree)
>>>>> {
>>>>> for(constauto&e:m_rootEntity->childNodes())
>>>>> e->deleteLater();
>>>>> }
>>>>> m_tree=newBranch(m_startPos,m_endPos,c_startBranchRadius,
>>>>> true,m_rootEntity);
>>>>> m_tree->setAge(0.0f);
>>>>> m_tree->updatePosition();
>>>>> m_tree->placeLeafs();
>>>>> }
>>>>>
>>>>> But a lot of memory are eaten.
>>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> Interest mailing list
>>> Interest at qt-project.org
>>> http://lists.qt-project.org/mailman/listinfo/interest
>>>
>>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest



More information about the Interest mailing list