Hi Philip, Your shouldn't need to explicitly call removeExpiredChildren() as osgProducer::Viewer will be doing this for you. Also memory usage does always match 1:1 to as all the "deleted" texture objects and display lists are cached rather than being disposed of straight away so that they can be later reused. This reuse is important as memory allocation and deletion is very expensive in OpenGL/graphics hardware, much more so that on main memory.
Robert. On 12/21/06, Philip Lowman <[EMAIL PROTECTED]> wrote:
Hi, I'm building a little app that constructs PagedLOD nodes for a set of terrain tiles based on their extents. The idea is to move around the database and have certain tiles paged in and as I move away from them have them paged out of memory. Anyways, I've noticed that although I'm calling removeExpiredChildren() on each of my PagedLOD objects some memory is being freed but a lot of memory isn't. I'll move outside of the paging radius of all of my tiles, for example, and the NodeList returned from removeExpiredChildren() will indicate that the nodes have been removed yet memory usage only appears to be going down slightly (and the nodes are much quicker to page back in, probably because memory isn't being freed). I'm not sure what I'm doing wrong to cause (or not cause) the memory to be freed. I have verified that getNumChildren() for each of the PagedLOD's after I move away from all of the terrain segments goes to 0 (after removeExpiredChildren() is called). I'm running OSG 1.2. Here's the basics of the code. Any advice would be appreciated. ========== // Set up the viewer osgProducer::Viewer viewer(args); viewer.setUpViewer(osgProducer::Viewer::STANDARD_SETTINGS); // Tell the viewer what to display for a help message viewer.getUsage(*args.getApplicationUsage()); osg::ref_ptr<osg::Group> group = new osg::Group(); group->setName("plod toplevel node"); vector< osg::ref_ptr<osg::PagedLOD> > plods; for(unsigned int i=0; i < terrain_filenames.size(); ++i) { // obtain center position double radius = bboxes[i].radius(); osg::Vec3 center = bboxes[i].center(); // setup new lod osg::ref_ptr<osg::PagedLOD> lod = new osg::PagedLOD(); lod->setName("plod for " + terrain_filenames[i]); lod->setRangeMode(osg::LOD::DISTANCE_FROM_EYE_POINT); lod->setFileName(0, terrain_filenames[i]); lod->setCenter(center); lod->setRadius(radius); lod->setRange(0, 0.0f, bboxes[i].radius() * 5.0); // FIXME group->addChild(lod.get()); } // Optimize the scene osgUtil::Optimizer optimizer; optimizer.optimize(group.get()); // set the scene to render viewer.setSceneData(group.get()); osg::Timer_t start_time = osg::Timer().tick(); osg::Timer_t last_output = osg::Timer().tick(); // Realize the viewer viewer.realize(); while( !viewer.done() ) { viewer.sync(); viewer.update(); // // Debuging code to call removeExpiredChildren() every so often // osg::Timer_t cur_time = osg::Timer().tick(); if ( osg::Timer().delta_s(last_output, cur_time) > 0.2) { last_output = cur_time; const double secs_since_start = osg::Timer().getSecondsPerTick() * (cur_time - start_time); double a_while_back = secs_since_start - 10.0; if(a_while_back < 0) a_while_back = 0; for(unsigned int i=0; i<group->getNumChildren(); ++i) { osg::NodeList nl; osg::PagedLOD *lod = static_cast<osg::PagedLOD*> (group->getChild(i)); bool removed_something = lod->removeExpiredChildren(a_while_back, nl); if(removed_something) { cout << "REMOVED STUFF. num children of lod " << lod->getName() << " is now " << lod->getNumChildren() << endl; for(uint i=0; i<nl.size(); ++i) { cout << "nl[" << i << "] name = " << nl[i]->getName() << endl; cout << "ref count = " << nl[i]->referenceCount() << endl; } } } } -- Philip Lowman Simulation Development Engineer, Modeling and Simulation Technology General Dynamics Land Systems http://www.gdls.com _______________________________________________ osg-users mailing list osg-users@openscenegraph.net http://openscenegraph.net/mailman/listinfo/osg-users http://www.openscenegraph.org/
_______________________________________________ osg-users mailing list osg-users@openscenegraph.net http://openscenegraph.net/mailman/listinfo/osg-users http://www.openscenegraph.org/