On 11.06.2015 15:50, Gunnar Sletta wrote:
> Hi Thomas,
>
> You are hitting one of the less ideal code paths with this testcase, see my 
> comments below. I think the core problems are already outlined in 
> https://bugreports.qt.io/browse/QTBUG-42853.
>
>> On 11 Jun 2015, at 14:32, Thomas Senyk <thomas.se...@pelagicore.com> wrote:
>>
>> Hi,
>>
>> currently trying to debug a weird behavior on a TI chip (armv7 with a
>> SGX GPU).
>>
>>
>> I have a fairly simple QML with a simple GridView with model:200 and
>> delegate:Text{text: "T#"+index}.
>> (it's a tiny bit more then that, but for argument sake this should be
>> enough)
>>
>> Then an animation scrolling up and down (on "contentY", without items
>> leaving the screen to avoid item creation in performance debugging).
>>
>> So far so good .. plain 60fps, all frames ~16ms
>>
>> But when I do
>>           color:  Qt.rgba(Math.random(), 1, 1,1);   [4]
>> on the Text-delegate, then I get very bad performance (<20fps).
>>
>> Looking closer at the frame times it's good performance for a couple of
>> frames (~16ms) and then one terrible frame with >200ms.
>>
>> That in mind I dug further .. and found that it's:
>> In every "bad" frame
>> Updater::visitGeometryNode [1]
>> this is called with m_added==1
>>
>> And this causes (because e->root==0 [2])
>> renderer->m_rebuild |= Renderer::FullRebuild;
>>
>> Then nearly all the frame time (>200ms) is spend uploading the new
>> batches in Renderer::uploadBatch [3]
>>
>>
>> Comparing all that with the "black"-case I see:
>>   - Batch  0 0x281f58 upload  root: 0x1a4a58
>>     - element: 0x27ad18 Rect( -0.833333 0.576389 27.4661 13.5365 )
>> node: GeometryNode( 0x27ab30 triangles #V: 12 #I: 18 x1= -0.833333 y1=
>> 0.576389 x2= 27.4661 y2= 13.5365 materialtype= 0xb6fad3c4 )  order: 1
>>     - element: 0x279ca0 Rect( 79.1667 0.732639 107.666 13.3889 )  node:
>> GeometryNode( 0x279ab8 triangles #V: 12 #I: 18 x1= -0.833333 y1=
>> 0.732639 x2= 27.6658 y2= 13.3889 materialtype= 0xb6fad3c4 )  order: 2
>>     - element: 0x278c28 Rect( 159.167 0.576389 187.327 13.3889 )  node:
>> GeometryNode( 0x278a40 triangles #V: 12 #I: 18 x1= -0.833333 y1=
>> 0.576389 x2= 27.3273 y2= 13.3889 materialtype= 0xb6fad3c4 )  order: 3
>>
>> ...all in one Batch.
>>
>> For color:
>>   - Batch  0 0x2845f8 upload  root: 0x16bd58
>>     - element: 0x283a20 Rect( -0.833333 0.576389 27.4661 13.5365 )
>> node: GeometryNode( 0x283838 triangles #V: 12 #I: 18 x1= -0.833333 y1=
>> 0.576389 x2= 27.4661 y2= 13.5365 materialtype= 0xb6f583c4 )  order: 1
>>   - Batch  1 0x1702c8 upload  root: 0x16bd58
>>     - element: 0x2829a8 Rect( 79.1667 0.732639 107.666 13.3889 )  node:
>> GeometryNode( 0x2827c0 triangles #V: 12 #I: 18 x1= -0.833333 y1=
>> 0.732639 x2= 27.6658 y2= 13.3889 materialtype= 0xb6f583c4 )  order: 2
>>   - Batch  2 0x2853a0 upload  root: 0x16bd58
>>     - element: 0x281930 Rect( 159.167 0.576389 187.327 13.3889 )  node:
>> GeometryNode( 0x281748 triangles #V: 12 #I: 18 x1= -0.833333 y1=
>> 0.576389 x2= 27.3273 y2= 13.3889 materialtype= 0xb6f583c4 )  order: 3
>>
>> ... one node one batch [4].
>>
>> So batching can't work on differently colored elements/text/..?
>>      ... is color a uniform per draw call?
>>
>>
>>
>>  From the past I know that my test-case had good performance on older
>> SoCs .. so the question I have right now are:
>>
>> [1]: There shouldn't be a new Node .. nothing new is created?
>
> I don’t understand the question.

Nothing in the UI is entering/leaving screen or explicitly 
created/destroyed ... so I wonder where the new Node comes from.

I'll look closer at what the Node is.

>
>>
>> [2]: Should one simple node cause all batches to be re-uploaded?
>>         .. or better: why do I get Renderer::FullRebuild?
>
> It depends, but when you are adding and removing nodes it may happen. If this 
> is combined with plenty of batches this will kill performance. More than 100 
> discrete glMap/Unmap/Draw calls per frame is likely to not be feasible on 
> embedded hardware. And the renderer is also adding some overhead when the 
> number of batches go up.
>

Got it .. so somehow the above mentioned "new Node" causes all the 
restruct/data-re-upload .. we'll look into it.

>> [3]: If all above is normal, then maybe it's the data upload that's to
>> long? glBufferData in unmap is 300-400us on average (with ~200 of them
>> in each "bad" frame) .. is that "normal"? sounds rather long for a
>> couple of vertices (if it's only a couple of vertices?)
>
> Uploading and scheduling drawing is slow. This is why we want things to be 
> batched so we minimise the overhead. You are currently hitting a worst case.
>
>> [4]: And again: I guess batching on non color-sharing elements is
>> supposed to not work?
>
> Text elements are only batched if they have the same color.
>
> The Rectangle node uses vertex-coloring which is batchable. The Image nodes 
> use a texture atlas which means they share state, so small-medium sizes 
> images are also batchable. We could have fixed the text node by putting the 
> text color into the text vertices, but I have not done that as it would make 
> the already significant memory footprint even higher. And most text elements 
> are black, gray or white anyway, so in practice it hasn’t been that bad. But 
> as you see, it doesn’t cover everything.
>
> As the task indicates, I'v been toying with the idea of putting the glyphs 
> into point sprites, so we could get away with one vertex per glyph and that 
> way make it cheap and sensible to make it per-vertex colored which would 
> allow batching across colors, but I haven’t gotten around to that yet.
>

Got it! So random (/many) colors on fonts are a no-go for now!
Fair enough given the overall good performance of font rendering in Quick2.

FYI: The "real" case is possible not even using many colors .. it was 
just me initial debug-case to work with. .. and I wanted to unterstand 
what's going on


Thanks!


> cheers,
> Gunnar
>
>>
>>
>>
>> Greets
>> Thomas
>> _______________________________________________
>> Development mailing list
>> Development@qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/development
>

_______________________________________________
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to