Hi Guys,

I wish to join the discussion because we are currently dealing with real 
problem related to this topic. 

First some background. Its a long comedy of circumstances and sideffects. But 
please bear with me...: 

1. We use PagedLOD database. We used our tools to build it, but it does not 
really differ from osgDEM produced DB. We use it for rendering and 
intersections. 
2. Its a simulation. We need to position and move many entities over terrain  
so we need exact intersections. To get exact elevations we use 
setLODSelectionMode( USE_HGHEST_LEVEL_OF_DETAIL ) to make sure 
IntersectionVisitor computes correct intersection.
3. I don't know if this was deliberate or not, but IntersectionVisitor in 
USE_HGHEST_LEVEL_OF_DETAIL mode does load highest level tiles temporary. It 
does intersections and free them. It does not hook them up to their parents.
4. Above has this horrible effect that if some node was not already loaded by 
DatabasePager it will be constantly loaded and removed by IntersectionVisitor. 
SARCASM#1: But don't loose faith there is a solution. See next point.
5. We found out that we can use osgSim::DatabaseCacheReadCallback to mitigate 
former problem. This is an IntersectVisitor read callback that keeps internal 
cache to avoid  repetitive loading and freeing. Well...this works but only for 
IntesectVisitor. DatabasePager does not know anything about this cache so when 
DatabasePager finally decides to load a tile it does it again, although 
IntersectionVisitor have already loaded it. SARCASM#2: But don't loose hope 
yet, because we found a solution to this as well....
6. How to make sure DatabasePager sees the tile IntersectVisitor already loaded 
? Its simple: We could use osgDB cache. So we started to load tiles with 
CACHE_NODES option and everything seemed to be fine....
7 But after some time we started to observe crashes and memory leaks. Long 
story about them is in my friend Pawel Ksiezopolski post "Re: [osg-users] 
PagedLOD experts?" from  November 5th. Short story is that caching tiles does 
not free renamed "NeedToRemove" nodes, but keep them in memory so with time 
some if them land int the scene again. When this happens, logic that was 
invented to remove not used nodes removes wrong ones leaving those that should 
be removed. Hence we get PageLOD thrashing and memory leaks. Cool HUH ? (Yes 
its SARCASM#3) 

Now to conclusion: 
In my opinion PageLOD renaming is the reason our elaborated scheme failed. I am 
both unhappy and glad that it happened because it clearly shows that 
Object::_name should not be modified by internal OSG methods. It should be 
never ever changed by OSG.  Management of node name belongs to creators or 
users of the node. 

Thats why I am going to prepare a fix that will not rename nodes to remove.  
But will instead drop their addresses into a set (or sorted vector) and will 
later us this set to test if node is marked for removal. It may be not O(n) but 
O(n log n) but it will work at least.  Is anyone preparing similar fix ?

Cheers,
Wojtek


----- Original Message ----- 
From: "Robert Osfield" <robert.osfi...@gmail.com>
To: "OpenSceneGraph Users" <osg-users@lists.openscenegraph.org>
Sent: Friday, November 20, 2009 10:58 AM
Subject: Re: [osg-users] Refactoring DatabasePager NeedToRemove stringflagging 
technique


Hi Chris,

On Mon, Nov 2, 2009 at 4:05 PM, Chris 'Xenon' Hanson
<xe...@alphapixel.com> wrote:
> I'm kind of an old-school C-flavor programmer, so my instinctive response is 
> rather
> C-like. I don't like bloating people's in-memory objects, so I'd lean towards 
> defining a
> 32-bit flag member on class Node called something like 
> _ephemeralInternalStateFlags. This
> would not be saved or restored, and the definitions of each flag bit would be 
> enumerated
> as 1<<n enums in the Node class header. Code outside of the OSG core 
> distribution would be
> prohibited (by policy, can't really enforce it in the compiler) from defining 
> and
> utilizing these flag bits, but code within OSG core could. The first bit 
> allocated would
> be used to replace the NeedToRemove indicator.

I'm not sure whether this is really needed.  The NeedToRemove trick in
DatabasePager is very specific to a piece of code embedded in
DatabasePager it has no value outside this specific bit of code, and I
believe it's not appropriate to build algorithm specific such support
into the core OSG.

> Also, while the read-modify-write cycle used to toggle just one bit of a flag 
> is not as
> fast as the blind-write cycle used when you dedicate a whole boolean variable 
> (and consume
> more memory), both the setting operation AND the testing operation should be 
> faster than
> the current string-marking technique.
>
> If Robert has no objections to this solution, I'll code it up quick and share 
> it.

I think the right thing to do is nothing in the core OSG, and look at
the specific DatabasePager algorithm to retain the O(1) cost of the
check that I was using, with the bugs with handling multiple
viewpoints.


> I'm also concerned about the amount of very similar-but-not-quite-the-same 
> code between
> DatabasePager::capped_removeExpiredSubgraphs and
> DatabasePager::expiry_removeExpiredSubgraphs. I'd like to refactor that to 
> DRY (Don't
> Repeat Yourself) it out a bit as I'm implementing some code of my own that 
> needs to
> cleanly dispose of some PagedLOD children. But, I don't understand why there 
> are
> differences in the disposal technique between them (one calls
> _fileRequestQueue->updateBlock() directly, one sets a local flag and calls 
> updateBlock()
> at the end of the operation, etc).

Both methods exists while we test the new
capped_removeExpiredSubgraphd , once it's fully tested and debugged
the old expiry_removeExpiredSubgraphs method will be removed
completely this neatly avoiding the issue of similar code.

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

Reply via email to