2016-05-13 4 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側のオブジェクトとして保持しているようです。

あなたは最初の場所(CACHE_NONECACHE_ALL & ~CACHE_ARCHIVES)でキャッシュを無効にするosgDB's optionsを見て持つことができますが、データは再利用および再ロードされない場合がありますので、これは実際に複数回あなたのメモリ消費量を増やすことができます。

osg::Textureは、OpenGLにアップロードした後にCPU側のテクスチャデータを解放するように指示することができます。これは便宜的にosgUtil::Optimizer::TextureVisitorで行うことができます。これを設定すると、テクスチャごとにAutoUnrefがtrueに変更されます。私は、OPTIMIZE_TEXTURE_SETTINGSでosgUtil :: Optimizerを実行すると同じ効果が得られると思います。その後

、あなたの質問のコードで行ったように、あなたのシーンを閉鎖した後、あなたは明示的にキャッシュを拭くためにOSGのデータベースページャを指示することができます:

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

が最終的にすべて事前に割り当てを取り除くためにGPU-あなたのビューとGLContextを破壊する必要があります。

+0

あなたのヒントをありがとう。実際にosgDBオプションを呼び出すと、キャッシュを非アクティブにするにはどうすればよいですか?ビューとGLContextを具体的にどのように破壊するのですか? – manatttta

関連する問題