[osg-users] Maximizing rendering throughput

Sebastian Messerschmidt sebastian.messerschmidt at gmx.de
Fri Oct 23 10:07:35 PDT 2015


Hi Robert,

Thanks for the explanation. I'm still puzzled by the question which 
elements can be updated in the update-phase without setting them to 
dynamic. I always was under the impression, that the update is performed 
before cull/draw are actually executed.
Right now I need some thread safe "time slot" to change the scene graph 
in terms of inserting nodes, updating transforms etc. I guess it is 
totally okay to do this in the update callback/operation.
But for changes to images, text, an arrays of drawables I need to set 
them to DYNAMIC if I understood you correctly. So basically what I got 
is, that I could put the draw of those elements as far to beginning of 
the draw as possible.

As for the double buffering: Can it be done at drawable level? Like 
swapping the front/back drawable back and forth, effectively doubling 
the geometry/image space needed?

Cheers
Sebastian
> Hi Robert,
>
> On 23 October 2015 at 12:36, Robert Milharcic 
> <robert.milharcic at ib-caddy.si <mailto:robert.milharcic at ib-caddy.si>> 
> wrote:
>
>     First of all, I didn't know that cull and draw traversal can
>     execute in parallel on a single scene. I always thought that cull
>     and draw can only execute sequential (serial) in all available
>     threading models. Anyway,  what I know for sure is that update and
>     draw traversal can indeed execute in parallel within some
>     threading models, and that is the reason why we need DYNAMIC
>     variance, to tell drawing thread it must process dynamic elements
>     first, and then immediately allow execution of the update
>     traversal in a main thread while STATIC elements are still being
>     rendered in a draw thread. I also suspect that next frame cannot
>     start before all the static+dynamic elements are rendered. If I'm
>     correct on this one, then few DYNAMIC elements should not affect
>     frame rate at all, because there is plenty of time to do the
>     processing while STATIC elements are still being rendered.
>
>
> With the DrawThreadPerContext and 
> DrawThreadPerContextCullThreadPerCamera threading models the static 
> part of the rendering can be done in parallel with the next frame.  
> You guess this correct.
>
> The one thing I'd add is that the OSG itself doesn't attempt to sort 
> DYNAMIC objects so that are drawn first. You can set up your 
> StateSet::RenderBinDetails to force the dynamic objects to be drawn 
> first, but you can only do this for objects that don't affect the 
> rendering of other objects, or are affected by what is the fame buffer 
> already.
>
> In the case of text it has to be placed in the depth sorted bin which 
> is drawn after the main opaque bin, so if there are text objects set 
> to DYNAMIC then you stop the next frame from start till the end of 
> dispatch of the last depth sorted dynamic object.  This may well be 
> very near the end of the draw dispatch so you come pretty close to 
> nullifying all the capacity for running the draw thread in parallel 
> with the next frames' update and cull traversals.  This is likely the 
> situation for Sebastian.
>
> Using double buffering of Text object's is probably the best way to 
> avoid updating a Text object while it's being drawn, allowing the Text 
> DataVariance to remain STATIC. Such double buffering could be done a 
> custom Node that has two Text objects, one for current frame being 
> updated, and one for the previous frame still being rendered.
>
> Robert.
>
>
>
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20151023/867af755/attachment-0003.htm>


More information about the osg-users mailing list