gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:27:35 25 4
gpt4 key购买 nike

我花了很多时间试图搞清楚 OSG 的内存管理。我有一个包含几个 child 的场景图(实际上是一个基于八叉树的 LOD)。

但是,当我需要重置场景时(我只想从场景中删除所有节点并删除内存),我使用

// 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,即,在从场景中清除它们之后,我希望释放内存。然而,这并没有发生:我的场景实际上被重置了,所有节点从查看器中消失,但内存仍然被占用。

尽管如此,当我将另一个场景加载到我的查看器时,内存会以某种方式重写(即,内存使用量不会增加,因此没有内存泄漏,但使用的内存始终相同)

我不能有这种行为,因为我需要密切控制内存使用。我该怎么做?

最佳答案

看起来 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 端表示,您需要销毁 View 和 GLContext。

关于c++ - 重置场景时 OpenSceneGraph 内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37205327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com