C++ 重置场景时OpenSceneGraph内存使用情况
我花了很多时间试图弄清楚OSG的内存管理。 我有一个有几个孩子的场景图(实际上是基于八叉树的LOD) 但是,当我需要重置场景时(我只想擦除场景中的所有节点,同时也擦除内存),我使用 在执行此操作之前,我使用NodeVisitor模式检查所有节点,发现所有节点的引用计数都为1,也就是说,从场景中清除它们后,我希望释放内存。但是,这并没有发生:我的场景实际上被重置,所有节点从查看器中消失,但内存仍然被占用 尽管如此,当我将另一个场景加载到我的查看器时,内存会以某种方式被重写(即,内存使用不会增加,因此没有内存泄漏,但使用的内存始终相同)C++ 重置场景时OpenSceneGraph内存使用情况,c++,memory,memory-management,openscenegraph,C++,Memory,Memory Management,Openscenegraph,我花了很多时间试图弄清楚OSG的内存管理。 我有一个有几个孩子的场景图(实际上是基于八叉树的LOD) 但是,当我需要重置场景时(我只想擦除场景中的所有节点,同时也擦除内存),我使用 在执行此操作之前,我使用NodeVisitor模式检查所有节点,发现所有节点的引用计数都为1,也就是说,从场景中清除它们后,我希望释放内存。但是,这并没有发生:我的场景实际上被重置,所有节点从查看器中消失,但内存仍然被占用 尽管如此,当我将另一个场景加载到我的查看器时,内存会以某种方式被重写(即,内存使用不会增加,因
我不能有这种行为,因为我需要严格控制内存使用。我该怎么做呢?看起来OSG将数据的缓存实例作为CPU端或GPU端对象保存 您可以先查看一下禁用缓存的方法(
CACHE\u NONE
,CACHE\u ALL&~CACHE\u ARCHIVES
),但这实际上会增加内存消耗,因为数据可能不会多次重复使用和重新加载
您可以指示osg::Texture
在上传到OpenGL后释放CPU端的纹理数据,以防您不再需要它。这可以方便地通过设置将每个纹理的AutoUnref
更改为true来完成。我认为,使用OPTIMIZE\u TEXTURE\u设置运行osgUtil::Optimizer可以达到同样的效果
然后,在关闭场景后,正如您在问题代码中所做的那样,您可以明确指示OSG的数据库寻呼机擦除缓存:
for( osgViewer::View v in AllYourViews )
{
v->getDatabasePager()->cancel();
v->getDatabasePager()->clear();
}
要最终摆脱所有预先分配的GPU端对象及其CPU端表示,您需要销毁视图和GLContext。谢谢您的提示。你能给我一些关于以下方面的额外见解吗:我实际上如何调用osgDB选项并停用缓存?如何具体销毁视图和上下文?
for( osgViewer::View v in AllYourViews )
{
v->getDatabasePager()->cancel();
v->getDatabasePager()->clear();
}