[osg-users] scene graph access in multithreaded mode

1 view
Skip to first unread message

Tugkan Calapoglu

unread,
Sep 3, 2008, 4:56:10 AM9/3/08
to osg-...@lists.openscenegraph.org
Hi,

I am porting an application from OSG0.99 to latest SVN version. 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.

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 ...

Cheers,
Tugkan
_______________________________________________
osg-users mailing list
osg-...@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Robert Osfield

unread,
Sep 4, 2008, 5:09:02 AM9/4/08
to OpenSceneGraph Users
Hi Tugkan,

On Wed, Sep 3, 2008 at 9:56 AM, Tugkan Calapoglu <tug...@vires.com> wrote:
> I am porting an application from OSG0.99 to latest SVN version.

Wow, climb aboard the time machine :-)

> 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.

Tugkan Calapoglu

unread,
Sep 5, 2008, 4:47:48 AM9/5/08
to OpenSceneGraph Users
Hi Robert,

> Hi Tugkan,
>
> On Wed, Sep 3, 2008 at 9:56 AM, Tugkan Calapoglu <tug...@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


--
Tugkan Calapoglu

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

Reply all
Reply to author
Forward
0 new messages