[osg-users] scene graph access in multithreaded mode

Tugkan Calapoglu tugkan at vires.com
Fri Sep 5 01:47:48 PDT 2008


Hi Robert,

> Hi Tugkan,
> 
> On Wed, Sep 3, 2008 at 9:56 AM, Tugkan Calapoglu <tugkan at vires.com> wrote:
> 
>>I am porting an application from OSG0.99 to latest SVN version.
> 
> 
> Wow, climb aboard the time machine :-)

I know :). We never had the time slot for the upgrade until now.

I have implemented the changes you suggested and it seems to work, no 
random crashed anymore in CullThreadPerCameraDrawThreadPerContext mode.

Thanks for the help,
tugkan



> 
> 
>>I have two
>>questions (both for CullThreadPerCameraDrawThreadPerContext mode):
>>
>>1- Is it safe to make changes in the scene graph outside the frame call
>>(without using update etc. callbacks )? Or is the only place where we have
>>safe scene graph acess is inside a callback? Mailing list and source code
>>reading made me think that outside the frame() should be safe but I am
>>getting some crashes. Before delving into my own code I'd like that someone
>>confirms this.
> 
> 
> Modifying the scene graph outside of the frame call is safe in
> SingleThreader, and CullDrawThreadPerCamera threading models as they
> don't leave any threads active after the end of the
> renderingTraversals() method (called from frame()).
> 
> With DrawThreadPerContext and CullThreadPerCamewraDrawThreadPerContext
> the draw threads will still be active on completion of the
> renderingTraversals(), so if you modifying drawables and state that
> the thread is still reading from in the draw traversal you will end up
> with problems - and potential crashes.  There is a standard mechanism
> to deal with this issue - and that is the renderingTraversals() method
> to block till all dynamic objects in the draw traversals have been
> dispatched.  The way you tell the draw traversal that an drawable or
> stateset will be modified dynamically is to set its data variance to
> DYNAMIC.
> 
>    drawable->setDataVariance(osg::Object::DYNAMIC);
>    stateset->setDataVariance(osg::Object::DYNAMIC);
> 
> This is mentioned in the "Quick Start Guide" book, as well as many
> times on the osg-users mailing list so have a look through the
> archives if you want more background reading.
> 
> 
> 
>>2- Is it ok to change the global state set during rendering outside frame
>>call? I have following code runing before frame() is called :
>>
>>osg::Camera* cam = getViewer()->getView(i)->getCamera();
>>cam->getOrCreateStateSet()->clear();
>>cam->getOrCreateStateSet()->setGlobalDefaults();
>>... And some other changes ...
> 
> 
> Same requirement - if you are modifying the stateset then you'll need
> to set its data variance to DYNAMIC.  For a StateSet that decorates
> the whole scene graph you'll end you holding back the frame till the
> whole scene graph is completed, so it won't have any performance
> advantage over CullDrawThreadPerContext.  You can double buffer
> objects to allow you to retain the STATIC data variance and keep the
> threads overlapping, to do this you do:
> 
> osg::Camera* cam = getViewer()->getView(i)->getCamera();
> cam->setStateSet() = new StateSet;  // this is where we just use a new
> StateSet rather than modify the previous one
> cam->getOrCreateStateSet()->setGlobalDefaults();
> ... And some other changes ...
> 
> The draw traversal takes a reference to the StateSet and Drawables so
> it's safe to go an remove them from the scene graph outside the
> frame() call, this isn't something makes then dynamic so you won't
> need to set their data variance to DYNAMIC.
> 
> Robert.
> 
> 
> Robert.
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> 


-- 
Tugkan Calapoglu

-------------------------------------
VIRES Simulationstechnologie GmbH
Oberaustrasse 34
83026 Rosenheim
Germany
phone    +49.8031.463641
fax      +49.8031.463645
email    tugkan at vires.com
internet www.vires.com
-------------------------------------
Sitz der Gesellschaft: Rosenheim
Handelsregister Traunstein  HRB 10410
Geschaeftsfuehrer: Marius Dupuis
                    Wunibald Karl
-------------------------------------



More information about the osg-users mailing list