Thanks, Robert. On second thought, forcing OSG to stop threading and flush
its backend structures would certainly cause a frame stall; handling this
some other way would produce better results. For now, waiting "a few frames"
to unload the DLL is a good solution.
   -Paul


> -----Original Message-----
> From: [EMAIL PROTECTED] 
> [mailto:[EMAIL PROTECTED] On Behalf 
> Of Robert Osfield
> Sent: Saturday, April 19, 2008 10:45 AM
> To: OpenSceneGraph Users
> Subject: Re: [osg-users] Clearing RenderLeaf ref_ptrs
> 
> Hi Paul,
> 
> The rendering backend - the StageGraph and RenderLeaf objects 
> both used ref_ptr<> to references to StateSet and Drawables 
> respectively.
> These are used to ensure when osgViewer is running 
> DrawThreadPerContext and 
> CullThreadPerCameraDrawThreadPerContext the objects don't get 
> deleted by the next frames update/event traversals whilst the 
> draw of the previous frame is still readying them.
> 
> To safely remove all these references you'd need to call
> stopThreading() on the viewer, then explictly release the 
> rendering backends data structures.  I'm afraid there isn't a 
> convenience method for doing this, but it wouldn't be hard to 
> add it to osgUtil::SceneView/RenderBin/RenderLeaf/StateGraph 
> and perhaps associated viewer classes.
> 
> Robert.
> 
> On Sat, Apr 19, 2008 at 3:25 PM, Paul Martz 
> <[EMAIL PROTECTED]> wrote:
> >
> >
> > Hi Robert --
> >
> > I recently discovered that if I remove a subgraph from the 
> scene graph 
> > during the update traversal, most parts of that subgraph 
> clean up (ref 
> > count goes to zero and memory is deallocated), but not 
> everything. In 
> > particular, RenderLeafs in the OSG backend appear to 
> maintain ref_ptrs 
> > to Drawables, and perhaps other objects as well. I've found their 
> > reference counts don't drop to zero until at least 2 frames 
> later. I'm 
> > sure this is for efficiency reasons, and it makes perfect 
> sense to me why this is done, of course.
> >
> > However, is there a way an app can force the OSG backend to 
> flush all 
> > ref_ptrs, so that I can be assured that OSG no longer has any 
> > references to my subgraph?
> >
> > I've encountered an issue on Windows, but not other 
> operating systems. 
> > The problem appears to be that memory allocated by a DLL gets 
> > deallocated when the DLL is unloaded. So, for example, I 
> might load a 
> > DLL, call into it to create a subgraph, render for a while, then 
> > remove the subgraph. I'd like to immediately unload the DLL at this 
> > point, but if I do, the subgraph memory is immediately deallocated, 
> > and OSG's backend now has dangling pointers into that 
> memory. A crash ensues.
> >
> > I can think of three ways to deal with this issue:
> > 1) Instruct OSG to clear its RenderStage, RenderBin, and RenderLeaf 
> > structures from the previous frame, thus clearing any ref_ptrs that 
> > might still reference my subgraph. Is there a way to do this?
> > 2) I could wait at least two frames before unloading the DLL.
> > 3) There might be a way, when initially loading my DLL, to 
> instruct it 
> > to share its heap with the main process, not sure.
> >
> > Thanks for your input,
> >
> > Paul Martz
> > Skew Matrix Software LLC
> > http://www.skew-matrix.com
> > +1 303 859 9466
> >
> >
> >
> >
> > Bob -- Doug and I discussed this by phone last night, so 
> this post is 
> > for your benefit.
> >
> > There are two "features" colliding here to cause this crash:
> >
> > 1) OSG maintains some ref_ptrs to Drawables after they've been 
> > rendered in the draw stage, which don't get cleared until 
> subsequent 
> > frames, probably for efficiency reasons (no point in spending time 
> > clearing pointers that will just be overwritten with new 
> addresses in the next frame).
> >
> > 2) Windows DLLs appear to have their own heap, separate from the 
> > process heap. When the DLL is unloaded, the DLL heap goes away.
> >
> > The result: Doug's code removes a DLL-allocated subgraph from their 
> > scene graph and immediately unloads the DLL. This causes 
> the DLL heap 
> > to go away (and all memory allocated on that heap). 
> Unfortunately, OSG 
> > still has some ref_ptrs to that memory (RenderLeafs pointing to 
> > Drawables). Those ref_ptrs are made to point somewhere else on 
> > subsequent renderings, which causes an
> > unref() call into an object that has already been 
> deallocated; badness 
> > ensues.
> >
> > Short-term workaround: wait N frames before unloading the DLL as a 
> > kind of garbage-collection scheme. I don't know whether N is 
> > determinate or not. In my tests, I had to wait at least 2 frames.
> >
> > Long-term solution: Windows might offer a way to force a 
> DLL to share 
> > the heap with the process that loads the DLL. This would require 
> > further investigation. OSG might also offer a way to flush 
> its backend 
> > RenderLeaf cache; I'll post to osg-users to find out.
> >
> > -Paul
> > _______________________________________________
> >  osg-users mailing list
> >  [email protected]
> >  
> > 
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.
> > org
> >
> >
> _______________________________________________
> osg-users mailing list
> [email protected]
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-opensce
negraph.org

_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to