2016-05-13 48 views
1

我花了很多時間試圖找出OSG的內存管理。 我有一個場景圖有幾個孩子(實際上是一個基於八叉樹的LOD)。OpenSceneGraph在重置場景時的內存使用情況

然而,當我需要重置我的場景(我只是想擦去德場景中的所有節點,也消除了內存),我用

// 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); 

之前,我做這個,我檢查我的所有節點使用NodeVisitor模式,發現所有節點的引用計數爲1,即從場景中清除它們後,我希望我的內存被釋放。但是,這不會發生:我的場景實際上被重置,所有節點都從查看器中消失,但內存仍然被佔用。

然而,當我加載另一個場景給我的觀衆,內存被莫名其妙地改寫(即,內存使用量沒有增加,因此不存在內存泄漏,但使用的內存始終是相同的)

我不能有這種行爲,因爲我需要嚴密控制內存使用情況。我怎樣才能做到這一點?

回答

1

看起來像OSG保存數據的緩存實例,無論是CPU端還是GPU端對象。

你可以看看osgDB's options禁用排在首位(CACHE_NONECACHE_ALL & ~CACHE_ARCHIVES)緩存,但是這實際上可以增加你的內存消耗數據可能不會被重新使用和重新加載多次。

您可以指示osg::Texture將CPU端紋理數據上傳到OpenGL後釋放 - 以防您不再需要它。這可以通過osgUtil::Optimizer::TextureVisitor方便地完成,您可以將其設置爲將每個紋理的AutoUnref更改爲true。我認爲,使用OPTIMIZE_TEXTURE_SETTINGS運行osgUtil :: Optimizer可以達到同樣的效果。

然後,收盤下跌場景,當你在你的問題的代碼做了之後,你可以明確地指示OSG的數據庫尋呼機擦拭它的高速緩存:

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

爲了最終擺脫所有預先分配的GPU-邊對象和它們的CPU端表示,你需要銷燬你的視圖和GLContext。

+0

謝謝你的提示。你可以給我一些額外的見解:如何實際調用osgDB選項來停用緩存?我如何特別銷燬視圖和GLContexts? – manatttta