[osg-users] Maximizing rendering throughput

Sebastian Messerschmidt sebastian.messerschmidt at gmx.de
Fri Oct 23 10:44:13 PDT 2015


Hi Glenn,
> Sebastian, here is my understanding.
>
> StateSets and Drawables must be marked as DYNAMIC is you plan to 
> change them. That's because they are used by the rendering stage, 
> which can overlap the next frame's update.
Okay, thank you for your insights.
>
> Everything else (scene graph structure, etc.) is safe to change during 
> the Update traversal/callbacks.
>
> Hope this helps.
Okay, there is some idea growing, how to get the maximum out of my use case.
>
> Glenn Waldron
>
> On Fri, Oct 23, 2015 at 1:07 PM, Sebastian Messerschmidt 
> <sebastian.messerschmidt at gmx.de 
> <mailto:sebastian.messerschmidt at gmx.de>> wrote:
>
>     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  <mailto:osg-users at lists.openscenegraph.org>
>>     http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
>     _______________________________________________
>     osg-users mailing list
>     osg-users at lists.openscenegraph.org
>     <mailto:osg-users at lists.openscenegraph.org>
>     http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
>
>
> _______________________________________________
> 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/cf109437/attachment-0003.htm>


More information about the osg-users mailing list