查看: 1454|回复: 5

有关context ID 重用(reuse)的问题

[复制链接]

该用户从未签到

发表于 2013-1-5 11:53:18 | 显示全部楼层 |阅读模式
大家好,在一个多窗口程序中(CompositeViewer管理所有视图,动态添加移除窗口),当创建一个新的view时,一切正常,当把一个view移除,然后再次创建一个新的view时,就会出现问题,和这个帖子中描述的同样的问题:
http://forum.osgearth.org/Textur ... gram-td7360915.html
打断点跟踪了一下,发现GraphicsContext :: createNewContextID()执行中的确重用了上次移除的contextID,上面那个帖子的回复中提到通过 osg::GraphicsContext::incrementContextIDUsageCount(graphicsContext->getState()->getContextID())  让osg不去重用这个contexID,不知这个解决办法是否合理。

该用户从未签到

发表于 2013-1-7 09:14:03 | 显示全部楼层
您可以自行实验,严格来说osg的contextID只是简单的根据view的数据递增的,所以只要您可以保证contextID不重复就没问题。不过一般来说动态添加删除view的确不是个好主意

该用户从未签到

 楼主| 发表于 2013-1-7 11:45:16 | 显示全部楼层
感谢array的回复,通过osg::GraphicsContext::incrementContextIDUsageCount()强制contextID计数器+1而不为0,的确可以解决问题,但是osg费劲心机重用这个ID大概有它的道理(至少它会带来这个像bug一样的问题)。如您所说,动态添加删除view兴师动众,还有一个思路,是否可以像osg回收过期的contextID一样,也回收用户删除的view,(标记这个view,不从CompositeViewer移除,仅仅view->setSceneData(0), qWidget->hide(),不知这个空跑的view的开销会不会很大?)。

该用户从未签到

发表于 2013-1-8 08:40:39 | 显示全部楼层
scenedata 为0 不用更新 不用绘制 没什么开销

该用户从未签到

 楼主| 发表于 2013-1-8 15:51:53 | 显示全部楼层
嗯,谢谢版主回复,现在程序工作良好。

该用户从未签到

发表于 2013-1-9 11:17:14 | 显示全部楼层
最简单的方式是隐藏这个View所在的窗口,即先通过GraphicsWindowWin32得到底层窗口对象然后设置HWND的隐藏即可
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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