查看: 1131|回复: 8

一个简单的问题,请赐教。

[复制链接]

该用户从未签到

发表于 2011-8-11 22:13:56 | 显示全部楼层 |阅读模式
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
这样的代码就可以加载一个三维模型到内存,问题是这个模型是会占用内存的,我不想用这个模型的时候,想释放它占用的内存,如何处理?

该用户从未签到

发表于 2011-8-12 08:47:20 | 显示全部楼层
对于智能指针管理的对象,只要所有的ref都不再存在,它就会被自动释放掉,很合理的机制
例如:
for (int i=0; i<10000; ++i)
{
    osg::ref_ptr<osg::Group> node = new osg::Group;
}

这几句话就永远不会有泄漏,因为局部量node的生命结束时就会自动释放它管理的节点数据,您自己永远都不必关心这件事

该用户从未签到

 楼主| 发表于 2011-8-13 00:47:30 | 显示全部楼层
可能我表述的有问题,我是想在场景里动态的撤销旧模型,更换新模型,并不是不理解智能指针。

该用户从未签到

 楼主| 发表于 2011-8-13 00:55:38 | 显示全部楼层
说的再具体点,比如我程序启动的时候给场景里加载了很多模型,而我想在程序不退出的情况下通过菜单操作释放这些三维模型占用的内存,以便再加载新的一大批模型。

该用户从未签到

发表于 2011-8-14 01:46:50 | 显示全部楼层
如果是局部变量,见2楼。
如果是全局变量,我觉得用一个容器来管理它为好,当只有这个容器持有它时(refcount==1),从容器中移出,自然会释放它占用的内存。
因为拿不到所有权,但可以通过增减引用计数达到指针的释放。
我觉得智能指针更像是一种资源,而不要把它当作指针来看。

该用户从未签到

 楼主| 发表于 2011-8-14 02:48:48 | 显示全部楼层
我觉得我还是没有说清楚。
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
这一行加载了模型,紧接着一行我就要释放cow.osg占用的内存,与智能指针没有一点关系,
就是要释放,osg插件为cow.osg所申请的顶点数组、纹理坐标数组、法线数组、纹理id等等被cow.osg所占用的一切资源,内存和显存。
让释放后一切变得干净,就像从来没有加载过模型一样,而程序不用退出。

该用户从未签到

发表于 2011-8-14 22:53:55 | 显示全部楼层
看看GLObjects、GLObjects.cpp里有没有你想要的。
OSG的数据缓存级别相当多,不太清楚如何一次清除所有的东东。不好意思。

该用户从未签到

发表于 2011-8-15 08:57:53 | 显示全部楼层
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
之后,设置
node = NULL;
这样就可以了

该用户从未签到

 楼主| 发表于 2011-8-15 21:40:03 | 显示全部楼层
感谢 array、roc的热情回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表