查看: 3346|回复: 8

osg::NodeProxy 加载数据与清除

[复制链接]

该用户从未签到

发表于 2009-3-18 21:44:17 | 显示全部楼层 |阅读模式
初学osg向各位请教了。
(1)用osg::NodeProxy 设置osg的数据路径,将数据加载到场景中,然后用removechild,把nodeProxy类型的节点从场景中删掉,
为什么内存没有完全清空呢?
(2)用osgdb:read得到的osg::node 类型 的 节点添加到场景,然后用removechild之后,数据从场景中删掉了,内存也清空了。
采用nodeProxy方式加载数据,要如何处理才将数据从内存清空呢?

该用户从未签到

发表于 2009-3-18 22:07:00 | 显示全部楼层
您说的是ProxyNode?不知您是如何编写这段程序的,能否给出一些能够说明问题的工程代码呢。

该用户从未签到

 楼主| 发表于 2009-3-19 18:29:31 | 显示全部楼层
添加数据:
int cOSG::lodLoad(void)
{
        //osg:agedLOD* pagedLOD = new osg::PagedLOD;
        //
        ////范围最大的可见层
        //pagedLOD->setFileName(0, "F:\\PRJDATA\\merge1-move-2.ive");
        //pagedLOD->setRange(0,4000,5000);
        //

        ////设置次大可见层
        //pagedLOD->setFileName(1, "F:\\PRJDATA\\merge2-move.ive");
        //pagedLOD->setRange(0, 2000,3000);

        osg::ProxyNode* proxyNode = new osg::ProxyNode;
        proxyNode->setFileName(0, "F:\\PRJDATA\\merge1-move-2.ive");
        proxyNode->setFileName(1, "F:\\PRJDATA\\merge2-move.ive");
        proxyNode->setLoadingExternalReferenceMode(osg::ProxyNode:EFER_LOADING_TO_DATABASE_PAGER);
        proxyNode->ref();
        long num = proxyNode->getNumChildren();
        mRoot->addChild(proxyNode);
        return 0;
}
删除数据
removeNode(void)
{
unsigned int pos = 0;               
osg::Node *root=NULL;               
osg::Node *ptNode = NULL;               
osg::Group *ptGp = NULL;               
osg::ProxyNode *ptProxNode = NULL;               
CStrLayer  *ptLayer = NULL;               
root = mOSG->mViewer->getSceneData();               
ptGp = dynamic_cast<osg::Group *>(root);               
long num = ptGp->getNumChildren();               
for(int i= 0;i<num;i++)                       
        {
        ptProxNode =dynamic_cast<osg::ProxyNode *>(ptGp->getChild(0));
        if(ptProxNode!=NULL)                               
                {                               
                ptGp->removeChild(ptProxNode);                       
                ptProxNode->unref();                               
                }
        }
}
数据添加,然后删除之后内存没有恢复到初始状态。

[ 本帖最后由 baiyufan 于 2009-3-19 18:31 编辑 ]

该用户从未签到

发表于 2009-3-19 19:25:26 | 显示全部楼层
proxyNode->ref()和ptProxNode->unref()都是多余的,不要用。删除节点之后观察一段时间,内存依然没有任何变化吗?还是说有减少但是没有减到初始状态。后者的话也可以检查一下程序中别的代码,我个人认为PagedLOD的工作机制应该没有什么问题。

该用户从未签到

 楼主| 发表于 2009-3-20 11:26:24 | 显示全部楼层
(1)开始没有用ref和unref,但是很奇怪的是不用的话,在删除的时候就出错了,错误是在osg35-osgd.dll。
(2)用了ref和unref,可以避免osg53-osgd.dll这个错,(有时候好像也有),删除之后,内存清除了部分,还有一些没有清除。
加载了3个ive数据之后,内存是60多m,清除之后,还有30多m,初始状态是16m

该用户从未签到

发表于 2009-3-20 12:15:05 | 显示全部楼层
和ref/unref没有直接关系。要注意您删除节点的时机,贸然调用删除函数是很容易崩溃的,一般建议是在回调里面,还有设置其父节点的setDataVariance为DYNAMIC。
此外也建议您升级一下osg的版本,osg35这个版本号好像比较老了?

该用户从未签到

 楼主| 发表于 2009-3-20 17:46:20 | 显示全部楼层
我现在用的osg的版本的2.4的源代码编译出来的,请教一下版主,更新到哪个版本比较稳定啊?
用2.8的吗?
我现在的开发环境是osg 2.4+ vs2003.net
新的osg版本是不是也要更新开发环境啊?vs2005是不是对osg 2.8支持的比较好啊

该用户从未签到

发表于 2009-3-20 19:28:53 | 显示全部楼层
没有什么区别,小数点后一位为偶数的都是稳定版本,例如2.4,2.6,2.8,只是功能和性能越来越好而已。OSG是使用CMake建立编译环境的,不需要特别使用哪个开发环境,vs7、8、9都可以,当然osg的主力开发者都是在Unix/Linux下进行开发的。

该用户从未签到

发表于 2013-7-19 10:09:36 | 显示全部楼层
请问楼主找到好的解决办法没有,我现在也遇到同样的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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