查看: 1642|回复: 5

读入模型的内存管理

[复制链接]

该用户从未签到

发表于 2010-12-2 21:59:28 | 显示全部楼层 |阅读模式
我试用一个类来管理渲染的内容,其中需要读入模型文件。因为都是用同一个模型文件,故:
static osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("aa.osg");
pGroup->addChild(model);//pGroup是类的成员变量,渲染管理的类根节点
因为场景管理需要多次创建这个类的对象实例,再删除。但是当多次new再delete时内存就会涨的离谱,cpu的占用只有15%但场景会卡的拖不动。
我把模型文件换成最简单的一个球体都不行,如下
// aa.osg
Geode {
  nodeMask 0xffffffff
  cullingActive TRUE
  num_drawables 1
  ShapeDrawable {
    Sphere {
      Center 0 0 0
      Radius 1
    }
    useDisplayList FALSE
    useVertexBufferObjects TRUE
    color 0 1 1 1
  }
}

但是如果不使用模型文件
直接画个球体则没有这种问题。
代码如下:
static osg::ref_ptr<osg::Geode> model = new osg::Geode;
model->addDrawable(new osg::ShapeDrawable(new Sphere(osg::Vec3(0.0,0.0,0.0),1)));
我肯定需要载入模型文件,而不能用简单球体代替,应该怎么让类管理模型文件才合理呢?

另外一个问题,当我的内存就涨的离谱,cpu的占用只有15%但场景会卡的拖不动时候如果继续运行程序经常会出现所有渲染的内容黑屏都不见了,调试信息会如下:
CullVisitor::apply(Geode&) detected NaN,
    depth=1.#QNAN, center=(1.#INF 1.#INF -1.#INF),
    matrix={
        -0.907168024754669 -0.0647062750557697 -0.415763481839279 0
        -0.420768552606671 0.139505348651275 0.896377198970932 0
        -9.98766902515769e-011 0.988104931505806 -0.153781157278474 0
        -1002070.78245605 -3928486.25385359 -21529922.9896044 1
}
CullVisitor::apply(Geode&) detected NaN,
    depth=1.#QNAN, center=(-127.205947875977 62.9670677185059 -87.7353591918945
,
    matrix={
        -1.#IND -1.#IND -1.#IND -1.#IND
        -1.#IND -1.#IND -1.#IND -1.#IND
        -1.#IND -1.#IND -1.#IND -1.#IND
        -1.#IND -1.#IND -1.#IND -1.#IND
}
CullVisitor::apply(Geode&) detected NaN,
    depth=1.#QNAN, center=(-1340424.75 -1.#IND 3584658),
    matrix={
        -0.935598770511473 -0.00722078523889849 -0.352991219264662 0
        -0.353065065699538 0.0191345971266103 0.935403082406394 0
        2.77555756156289e-017 0.999790841853103 -0.0204517125606629 0
        -970295.520319227 -4027010.53137235 -16840189.5548042 1
}
这可能是由于什么原因引起的呢?

请各位高手不吝赐教,帮我分析分析上面两个问题。谢谢

该用户从未签到

发表于 2010-12-3 08:27:07 | 显示全部楼层
因为场景管理需要多次创建这个类的对象实例,再删除。但是当多次new再delete时内存就会涨的离谱
请给出您实现这一过程的代码,只凭文字我无法判断什么

该用户从未签到

 楼主| 发表于 2010-12-3 21:39:51 | 显示全部楼层
我建了一个SystemTrack类。其中有成员变量pGroup管理需要渲染的内容osg::ref_ptr<osg::Group> pGroup;
pGroup->addchild(model);//初始化的时候添加model;

再建一个std::map<unsinged short,SystemTrack> m_SystemTrack 管理类的实例
当接收网络信息需要添加SystemTrack实例的时候先初始化一个SystemTrack对象
SystemTrack st;
st.initial();
//再把st的pGroup添加入渲染的全局节点,并使用std::map管理实例
root->addChild(st.pGroup);
m_SystemTrack->insert(std::make_pair(ID,ST));
当需要修改某个ID实例的渲染内容的时候
m_SystemTrack[ID].updata();
最后需要删除某个ID实例的时候
root->removeChild(m_SystemTrack[ID].pGroup);
m_SystemTrack.erase(ID);

因为代码不能带出来,只能描述大概过程。麻烦Array大牛给我看看这样管理需要多次new和delete的对象行不行,谢谢!

该用户从未签到

 楼主| 发表于 2010-12-4 18:43:18 | 显示全部楼层
请给出您实现这一过程的代码,只凭文字我无法判断什么
array 发表于 2010-12-3 08:27

这样描述可以么?麻烦Array看看,用osg做开发实在很着急,多谢了。

该用户从未签到

 楼主| 发表于 2010-12-5 19:13:02 | 显示全部楼层
请给出您实现这一过程的代码,只凭文字我无法判断什么
array 发表于 2010-12-3 08:27

这样描述可以么?麻烦Array看看,用osg做开发实在很着急,多谢了

该用户从未签到

发表于 2010-12-6 10:24:52 | 显示全部楼层
这样描述并没有什么意义,您的做法当然是可以的,但是其中并不能反映您的代码是否存在什么问题,比如您的模型是否真的被卸载出内存了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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