Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重置场景时OpenSceneGraph内存使用情况_C++_Memory_Memory Management_Openscenegraph - Fatal编程技术网

C++ 重置场景时OpenSceneGraph内存使用情况

C++ 重置场景时OpenSceneGraph内存使用情况,c++,memory,memory-management,openscenegraph,C++,Memory,Memory Management,Openscenegraph,我花了很多时间试图弄清楚OSG的内存管理。 我有一个有几个孩子的场景图(实际上是基于八叉树的LOD) 但是,当我需要重置场景时(我只想擦除场景中的所有节点,同时也擦除内存),我使用 在执行此操作之前,我使用NodeVisitor模式检查所有节点,发现所有节点的引用计数都为1,也就是说,从场景中清除它们后,我希望释放内存。但是,这并没有发生:我的场景实际上被重置,所有节点从查看器中消失,但内存仍然被占用 尽管如此,当我将另一个场景加载到我的查看器时,内存会以某种方式被重写(即,内存使用不会增加,因

我花了很多时间试图弄清楚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();
}