查看: 2018|回复: 11

在MFC框架下,回调多次是否存在越界问题?在控制台下调试没有错,集成到MFC框架下出

[复制链接]

该用户从未签到

发表于 2013-3-10 16:31:49 | 显示全部楼层 |阅读模式
void AL_Route::update(osg::NodeVisitor *nv, osg:rawable *drawable)
        {
                osg::Geometry* geom = dynamic_cast<osg::Geometry*>(drawable);
                if(!geom)return;

                osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray());
                if(vertices)
                {
                        angle =angle+ speed;    // float angle; float speed;
                      vertices->push_back(osg::Vec3(radius*cos(angle),0.0,radius*sin(angle)));
                        int k=vertices->getNumElements();
                        geom->addPrimitiveSet(new osg::DrawArrays(osg::DrawArrays:INE_STRIP,0,k));
                        vertices->dirty();
                }
               
        }
这样实现回调正确么?存在越界的可能性大不大?
调试过程中,回调多次会发生错误,在控制台下调试没有错误,集成到MFC框架下出现错误是怎么回事?

该用户从未签到

 楼主| 发表于 2013-3-10 16:57:02 | 显示全部楼层
错误如下:
调用堆栈:

>        osg65-osgd.dll!osg::Geometry::drawImplementation(osg::RenderInfo & renderInfo={...})  行1540 + 0xb 字节        C++
        osg65-osgd.dll!osg:rawable::draw(osg::RenderInfo & renderInfo={...})  行898 + 0x13 字节        C++
        osg65-osgUtild.dll!osgUtil::RenderLeaf::render(osg::RenderInfo & renderInfo={...}, osgUtil::RenderLeaf * previous=0x00000000)  行74 + 0x19 字节        C++
        osg65-osgUtild.dll!osgUtil::RenderBin::drawImplementation(osg::RenderInfo & renderInfo={...}, osgUtil::RenderLeaf * & previous=0x00000000)  行448 + 0x19 字节        C++
        osg65-osgUtild.dll!osgUtil::RenderStage::drawImplementation(osg::RenderInfo & renderInfo={...}, osgUtil::RenderLeaf * & previous=0x00000000)  行1274        C++
        osg65-osgUtild.dll!osgUtil::RenderBin::draw(osg::RenderInfo & renderInfo={...}, osgUtil::RenderLeaf * & previous=0x00000000)  行393 + 0x17 字节        C++


输出:

“HardDiskS.exe”: 已加载“G:\OSG\OpenSceneGraph-2.8.4\bin\bin\osg65-osgFXd.dll”,已加载符号。
“HardDiskS.exe”: 已加载“G:\OSG\OpenSceneGraph-2.8.4\bin\bin\osg65-osgTerraind.dll”,已加载符号。
“HardDiskS.exe”: 已加载“C:\Windows\System32\zlibd1.dll”
Warning: no message line prompt for ID 0x0000.
Warning: no message line prompt for ID 0x8023.
Warning: no message line prompt for ID 0x8023.
Warning: no message line prompt for ID 0x8023.
HardDiskS.exe 已触发了一个断点

该用户从未签到

发表于 2013-3-10 17:41:02 | 显示全部楼层
等大神回复吧      学习中…………

该用户从未签到

发表于 2013-3-11 08:03:49 | 显示全部楼层
是否设置了某一个Geometry的dynamic,还有setUseDisplayList(false)

该用户从未签到

发表于 2013-3-11 09:43:24 | 显示全部楼层
geom->addPrimitiveSet(new osg:rawArrays(osg:rawArrays:INE_STRIP,0,k));
这个回调最大的问题是一直在不停地添加PrimitiveSet,这样一定会导致您的系统爆仓的

该用户从未签到

 楼主| 发表于 2013-3-11 19:44:52 | 显示全部楼层
本帖最后由 huaihuai 于 2013-3-11 20:01 编辑
liuzhiyu123 发表于 2013-3-11 08:03
是否设置了某一个Geometry的dynamic,还有setUseDisplayList(false)


谢谢。
我是这样实现的
        lineGeom->setUpdateCallback(route);                //调用回调,动态画出路径 route是AL_HDRoute的类对象
        lineGeom->setUseDisplayList(false);        //关闭列表显示
        lineGeom->setUseVertexBufferObjects(true);//启用VBO显示
这样有错误么?

该用户从未签到

 楼主| 发表于 2013-3-11 19:48:10 | 显示全部楼层
array 发表于 2013-3-11 09:43
这个回调最大的问题是一直在不停地添加PrimitiveSet,这样一定会导致您的系统爆仓的

谢谢哦 我是这样修改的     
if(vertices)
                {
                        angle =angle+ speed;
                    vertices->push_back(osg::Vec3(radius*cos(angle),0.0,radius*sin(angle)));
                        int k=vertices->getNumElements();

                        int m = geom->getNumPrimitiveSets();  //添加修给的
                        if(m!=0)
                                geom->removePrimitiveSet(0);

                        geom->addPrimitiveSet(new osg:rawArrays(osg::DrawArrays:INE_STRIP,0,k));
                        vertices->dirty();
                }
这样修改是否可行?
我试过了,还是会出错。

该用户从未签到

发表于 2013-3-11 20:28:53 | 显示全部楼层
想实现的啥功能呢?一直在add就不是一个好现象~~

该用户从未签到

 楼主| 发表于 2013-3-11 20:55:43 | 显示全部楼层
Gooogle 发表于 2013-3-11 20:28
想实现的啥功能呢?一直在add就不是一个好现象~~

就显示出画圆的过程,实现笔过流痕的效果。

该用户从未签到

发表于 2013-3-12 07:50:03 | 显示全部楼层
您那个圆将会无限制的画下去,问题就是这里

该用户从未签到

 楼主| 发表于 2013-3-12 12:56:44 | 显示全部楼层
liuzhiyu123 发表于 2013-3-12 07:50
您那个圆将会无限制的画下去,问题就是这里

但是我是用setUpdateCallback(new AL_HDRoute())与setUpdateCallback(NULL)配合使用的,很多时候半个圆都没画完就出错了。在控制台调试的时候没有出现这个问题。

该用户从未签到

 楼主| 发表于 2013-3-13 17:53:29 | 显示全部楼层
求大神指点一二
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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