Hi Robert, Great improvement! Memory usage dropped almost 6 fold for our paged scenes, from oscillating around 350MB to rock solid 60MB (WinXP).
Many thanks, Maciej 2008/3/28, Robert Osfield <[EMAIL PROTECTED]>: > > Hi All, > > Testing that I've been carrying out on some new big terrain databases > has shown some real weaknesses in the DatabasePager ability to load > balance - with memory footprint growing significantly when the camera > moves fast over wide areas of high res data. Memory usage was growing > to over 4GB and blowing our test computers, hardly something that is > desired for a database paging system that is supposed to maintain a > modest memory footprint. > > After much investigation the cause of the rather unconstrained memory > usage has been traced to the slow speed that the DatabasePager was > expiring (removing) no longer visible subgraphs - subgraphs were > correctly ear marked for removal but idsyncrosies in the threading and > original DatabasePager::removeExpiredSubgraphs(..) method meant that > it would take many frames to finally let go expired subgraphs. It in > fact was taking long enough that new data was coming in at a far > faster rate than it was been removed at hence the dramatic growth in > memory footprint. > > The solution has been to rewrite > theDatabasePager::removeExpiredSubgraphs(..) method that is > responsible for expiring subgraph and setting them aside for deletion. > I've now got this new implementation working and sees a memory > footprint halved which not affecting the visual quality on screen. > Performance is now much more stable and crashes due to excessive > memory consumption are gone on my test machine. With this rewrite a > couple member variables and their associated set/getters are no longer > required, and rather leave them around for potential confusion I've > removed them completely so an svn update if you get an compile error > just remove the below methods and recompile. > > - /** Set the maximum number of PagedLOD child to remove per frame > */ > - void setMaximumNumOfRemovedChildPagedLODs(unsigned int > number) { _maximumNumOfRemovedChildPagedLODs = number; } > - > - /** Get the maximum number of PagedLOD child to remove per frame > */ > - unsigned int getMaximumNumOfRemovedChildPagedLODs() const { > return _maximumNumOfRemovedChildPagedLODs; } > - > - /** Set the minimum number of inactive PagedLOD child to keep */ > - void setMinimumNumOfInactivePagedLODs(unsigned int number) { > _minimumNumOfInactivePagedLODs = number; } > - > - /** Get the minimum number of inactive PagedLOD child to keep */ > - unsigned int getMinimumNumOfInactivePagedLODs() const { > return _minimumNumOfInactivePagedLODs; } > > I would like to improve this method further still as I've already come > up with a better load balancing algorithm to implement in this method, > however, it'll take a while longer to implement, so rather than wait > for this polished implementation I'm checking in what is working > effectively, albeit not perfect it is far better than what was there > before. > > There are other aspects of the DatabasePager that need attention too, > such as the high cost of DatabasePager::requestNodeFile() method > during cull traversal when many file requested are queued up. This is > something that has been raised on the list before by others, so it's a > bit of common theme when we really start to push the size of paged > databases we are dealing with. I will be spending more time on this > code over the coming month, so feel free to chip in with your own > experiences. > > Cheers, > 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