查看: 1454|回复: 3

动态加载osgOcean,内存一直暴增,求卸载osgOcean的方法

[复制链接]

该用户从未签到

发表于 2012-7-5 16:25:04 | 显示全部楼层 |阅读模式
osgOcean海洋效果非常好,更难为可贵的是,还可以给海洋设置海平面高度及风速。
为了更好地展现osgOcean的效果,程序中动态加载卸载osgOcean,展现不同高度,不同风速的海洋。

现在遇到osgOcean无法卸载!
加载海洋的方法:
osgOcean::ShaderManager::instance().enableShaders(!disableShaders);
        m_pOceanSceneNode = new OceanSceneModel(sky_type,windDirection, windSpeed, depth, reflectionDamping, scale, isChoppy, choppyFactor, crestFoamHeight);
        m_pOceanSceneNode->getOceanScene()->setOceanSurfaceHeight(fOceanHeight);
        m_pOceanSceneNode->getOceanScene()->setNodeMask( m_pOceanSceneNode->getOceanScene()->getNormalSceneMask() |        
        m_pOceanSceneNode->getOceanScene()->getReflectedSceneMask() |
        m_pOceanSceneNode->getOceanScene()->getRefractedSceneMask() );
        m_pRoot->addChild( m_pOceanSceneNode->getScene() );
海洋就可以再场景中正常显示,可以改变天空类型,风向、海平面高度等。

卸载海洋的方法:
                bool bUnLoadSkyFlag=m_pOceanSceneNode->getOceanScene()->removeChild(m_pSkyDome);
                bool bUnLoadOceanFlag=m_pRoot->removeChild(m_pOceanSceneNode->getScene());

                if (bUnLoadOceanFlag&&bUnLoadSkyFlag)
                {               
                        m_pSkyDome=NULL;
                        m_pOceanSceneNode=NULL;
                        bLoadSkyFlag=false;
                        bLoadOceanFlag=false;
                        cout<<"removed ocean and sky success!"<<endl;
                        return true;
                }
                else

                        cout<<"removed ocean and sky failed!"<<endl;
                return false;

第一次加载海洋,内存占用300M,
第二次加载海洋,内存占用403M,
第三次加载海洋,内存占用515M,
实验证明,卸载函数是失败的。

怎样才可以把海洋成功卸载?

该用户从未签到

发表于 2012-7-10 09:45:47 | 显示全部楼层
理论上只要所有的智能指针都被释放就可以了,您可以检查这一点。至于osgocean是否内部有什么不使用智能指针的分配而且无法释放,这个我就不太清楚了,您可以直接在osg-users上面提问

该用户从未签到

 楼主| 发表于 2012-7-19 15:31:13 | 显示全部楼层
array 发表于 2012-7-10 09:45
理论上只要所有的智能指针都被释放就可以了,您可以检查这一点。至于osgocean是否内部有什么不使用智能指针 ...

问题解决了,
进入osgcean,仔细查看了m_pOceanSceneNode->getScene()所addchild的所有东西(用XX代替),然后remove掉所有的XX,然后再
m_pOceanSceneNode->getOceanScene()->removeChild(m_pSkyDome);
m_pRoot->removeChild(m_pOceanSceneNode->getScene());
海洋就卸载成功了。

多次的实验表明,osg中似乎卸载加载满足这么一条规律:first addchild first remove(先加载先卸载)。

该用户从未签到

发表于 2012-7-23 10:26:35 | 显示全部楼层
first addchild first remove(先加载先卸载)
不是这样的,没有这种类似管道的机制存在
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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