2016-05-13 14 views
1

Ich habe viel Zeit damit verbracht, herauszufinden, OSG Speicherverwaltung. Ich habe eine Szene Graph mit mehreren Kindern (eigentlich eine LOD basierend auf einem Octree).OpenSceneGraph Speicherverbrauch beim Zurücksetzen der Szene

Allerdings, wenn ich meine Szene zurücksetzen müssen (Ich möchte nur alle Knoten von de Szene wischen und auch das Gedächtnis wischen), verwende ich

// Clear main osg::Group root node 
m_rootNode->removeChildren(0, m_rootNode->getNumChildren()); 
m_rootNode->dirtyBound(); 

// Clear Main view scene data from osg::Viewer 
m_viewer->setSceneData(nullptr); 

, bevor ich dies tun, ich alle meine Knoten überprüfen mit einem NodeVisitor-Muster und fand heraus, dass ALLE meine Knoten den Referenzzähler 1 haben, dh nachdem ich sie aus der Szene gelöscht habe, erwarte ich, dass mein Speicher freigegeben wird. Dies geschieht jedoch nicht: Meine Szene wird tatsächlich zurückgesetzt, alle Knoten verschwinden aus dem Viewer, aber der Speicher bleibt belegt.

Dennoch, wenn ich eine andere Szene zu meinem Betrachter laden, wird der Speicher neu geschrieben irgendwie (dh die Speichernutzung nicht erhöht, daher gibt es keinen Speicherverlust, sondern verwendete Speicher ist immer die gleiche)

I kann dieses Verhalten nicht haben, da ich die Speichernutzung genau kontrollieren muss. Wie kann ich das machen?

Antwort

1

Sieht so aus, als ob OSG zwischengespeicherte Instanzen Ihrer Daten entweder als CPU-seitige oder als GPU-seitige Objekte speichert.

Sie konnten einen Blick auf osgDB's options haben Caching in erster Linie (CACHE_NONE, CACHE_ALL & ~CACHE_ARCHIVES) zu deaktivieren, aber dies Ihr Speicherverbrauch tatsächlich erhöhen können als Daten nicht wiederverwendet werden kann und mehrere Male erneut geladen.

Sie könnten osg::Texture anweisen, die CPU-seitigen Texturdaten nach dem Upload zu OpenGL freizugeben - falls Sie sie nicht mehr benötigen. Dies kann bequem über die osgUtil::Optimizer::TextureVisitor vorgenommen werden, die Sie einrichten möchten, um die AutoUnref für jede Textur auf True zu ändern. Ich denke, das Ausführen von osgUtil :: Optimizer mit der OPTIMIZE_TEXTURE_SETTINGS erreicht den gleichen Effekt.

Dann, nach der Szene Schließung, wie Sie in Ihrer Frage Code haben, können Sie explizit OSG Datenbank Pager anweisen, seine Caches zu wischen:

for(osgViewer::View v in AllYourViews) 
{ 
    v->getDatabasePager()->cancel(); 
    v->getDatabasePager()->clear(); 
} 

schließlich aller im Voraus zugewiesenen loszuwerden GPU- Side-Objekte und ihre CPU-seitigen Darstellungen, müssten Sie Ihre Ansichten und GLContext zerstören.

+0

Vielen Dank für Ihre Hinweise. Kannst du mir noch etwas mehr über die folgenden Dinge erzählen: Wie aktiviere ich osgDB-Optionen, um den Cache zu deaktivieren? Wie zerstöre ich speziell die Ansichten und GLC-Texte? – manatttta