查看: 1715|回复: 9

内存上升----

[复制链接]

该用户从未签到

发表于 2011-1-24 12:41:00 | 显示全部楼层 |阅读模式
void MyHandle::createField(double h)
{
        unsigned int a=(unsigned int )(_point._v[0]+INTERVAL/2)/INTERVAL;//四舍五入
        unsigned int b=(unsigned int )(_point._v[1]+INTERVAL/2)/INTERVAL;//a,b用作圆心

        unsigned int radio=(unsigned int)RADIO/INTERVAL;//用作半径

        osg::ref_ptr<osg::Vec3Array> v=dynamic_cast<osg::Vec3Array *>(_geometry->getVertexArray());

        osg::Vec2Array* gridPoint=new osg::Vec2Array(360*radio);       

        for (int i=0;i!=radio;i++)//圆面上的点 由最外层向圆心 依次加入到array中
        {
                for (unsigned int degree=0;degree<360;degree++)
                {
                        double x=a+(radio-i)*cosf(degree*osg:I/180);//圆的x坐标,x范围[0,100)
                        double y=b+(radio-i)*sinf(degree*osg::PI/180);

                        unsigned int temp_COLUMN=COLUMN-1;

                        if (x<0) x=0;
                        if (x>temp_COLUMN) x=temp_COLUMN;
                        if (y<0) y=0;
                        if (y>temp_COLUMN) y=temp_COLUMN;
                        (*gridPoint)[360*i+degree].set((unsigned int)x,(unsigned int)y);

                }
        }       
        for (int i=0;i!=radio;i++)
        {
                for (int n=0;n<360;n++)
                {
                        unsigned int x=(*gridPoint)[360*i+n].x();
                        unsigned int y=(*gridPoint)[360*i+n].y();
                        int temp=x*COLUMN+y;
                        double temp_z=(*v)[temp].z();

                        float hudu;
                        hudu=float(i)/(float)radio;

                        (*v)[temp].set(x*INTERVAL,y*INTERVAL,h);//平台

                }
        }
                //v->dirty();
        _geometry->setVertexArray(v);
}

调用上面的函数,内存会不断上升,不理解……
恳请赐教,不胜感激

该用户从未签到

 楼主| 发表于 2011-1-24 15:24:20 | 显示全部楼层
简单的说就是 得到一个geometry的顶点数组,然后改变部分顶点的高度。内存为什么会升高呢?
1楼是代码,恳请帮忙分析一下,非常谢谢

该用户从未签到

发表于 2011-1-24 18:16:55 | 显示全部楼层
既然是更新的话,为什么要不断的set呢,,,改变之后dirty()就可以了~~~~

该用户从未签到

 楼主| 发表于 2011-1-24 21:25:52 | 显示全部楼层
非常感谢,我试一下

该用户从未签到

 楼主| 发表于 2011-1-25 09:38:21 | 显示全部楼层
如果不setVertexArray(v); 内存是没有变化,但geometry的某一点的高度只能改变一次,请教一下是否可以在set之前清理掉原来的array,应怎么做?
谢谢

该用户从未签到

 楼主| 发表于 2011-1-25 09:40:37 | 显示全部楼层
还想请教另外一个问题:
texture->setImage(image.get());
……
texture->getImage(); 得不到image可能什么原因?

该用户从未签到

发表于 2011-1-25 11:04:41 | 显示全部楼层
6# heye
这个可能是[size=14.1667px]纹理被加载到OpenGL纹理内存中后,删除系统内存中的对象。如果是,请参考阿锐的这个帖子:[size=14.1667px]http://bbs.osgchina.org/viewthread.php?tid=4191&highlight=%CE%C6%C0%ED

该用户从未签到

 楼主| 发表于 2011-1-25 12:18:10 | 显示全部楼层
非常感谢您



1楼问题继续请教……
7# CWorld

该用户从未签到

发表于 2011-1-26 08:15:59 | 显示全部楼层
  1. osg::Vec2Array* gridPoint=new osg::Vec2Array(360*radio);
复制代码
您在这里分配了一个Vec2数组,但是又不使用智能指针管理,而且没有把它应用给任何的场景对象,这样当然会不断占用内存了

该用户从未签到

 楼主| 发表于 2011-1-26 10:57:26 | 显示全部楼层
非常感谢array,的确是这个问题。
原以为该函数析构以后会自动释放~~
用智能指针就ok了
再次感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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