查看: 3283|回复: 6

代理节点和.net插件的问题

[复制链接]

该用户从未签到

发表于 2008-3-4 21:05:01 | 显示全部楼层 |阅读模式
osg::Image*  DefaultImage = osgDB::readImageFile("http://www.duote.com/img/zt1.jpg.net");
osg::Node*   node = osgDB::readNodeFile("http://121.14.136.116/models/F_001.ive.net");
上面的DefaultImage和node通过.net来readFile,那他们就自动被转化为ProxyNode了吗?如果不用多线程的话,上面的DefaultImage 和node 都会要等到该文件下载完的时候才继续执行,但进入程序时已经可以看见该节点.
我想一遇到文件名有.net的字样的就开个线程来下载,但是_beginthread后,
线程函数只执行到BB->mDefaultImage = osgDB::readImageFile(ImageName);
//参数ImageName就是http://121.14.136.116/models/F_001.ive.net此类字样
//BB是经过强制转换后的当前类的This
这一句就跳回上一句了,并且会跳到其他地方去,也不知道怎么调试了.这样倒是不用等文件全部下载完才能进入程序,进入的很快,但是下载来的文件有问题,显示不正常,很多重复的文件.而且一旦此类需.net的文件多了,就会报错了,断点哪里都停不住,真迷茫.
再请高人给讲一下,这种远程拉来的数据,在本机上要怎样处理才最好呢,想要在下载完成时才显示该节点.

该用户从未签到

发表于 2008-3-4 21:54:20 | 显示全部楼层
原帖由 WinMain 于 2008-3-4 21:05 发表
osg::Image*  DefaultImage = osgDB::readImageFile("http://www.duote.com/img/zt1.jpg.net");
osg::Node*   node = osgDB::readNodeFile("http://121.14.136.116/models/F_001.ive.net");
上面的DefaultImage和 ...


呵呵,楼主研究的很深入啊,建议什么时候写一篇教程吧
我没有在.net的源代码中找到转换为ProxyNode的字样,估计应该是作为普通的Node,Image或者HeightField读入的。
.net插件是使用socket来执行网络数据的读取的,全部读取完成后再使用相应的readNodeFile等函数获取模型。不建议楼主新开一个线程来处理,很难说会发生什么。
楼主如果想自己读入网络数据,然后自由决定怎样进行处理,也许可以沿着下面的思路来进行:
1、使用自己的方式读入网络数据到istream中;
2、使用ReaderWriter::readImage(std::istream &, const Options *)从数据流中读入模型数据,并控制读取进度和状态。可以参考:
http://www.osgchina.org/projects ... LoadingProgress.php

该用户从未签到

 楼主| 发表于 2008-3-4 22:26:32 | 显示全部楼层
谢谢拉.又帮我一次啊.我就用Stream来弄一下吧,有个问题还不清楚,就是怎么替换下载完毕的Image,Node?
http://www.osgchina.org/projects ... LoadingProgress.php这个下载来的压缩包解压错误

该用户从未签到

发表于 2008-3-4 22:34:39 | 显示全部楼层
原帖由 WinMain 于 2008-3-4 22:26 发表
谢谢拉.又帮我一次啊.我就用Stream来弄一下吧,有个问题还不清楚,就是怎么替换下载完毕的Image,Node?
http://www.osgchina.org/projects ... LoadingProgress.php这个下载来的压缩包解压错误


“替换下载完毕的Image”?呵呵,抱歉我不太清楚这里的替换是什么意思,可能我对您的工作需求还不太了解。
下载地址应该是没有问题的,我刚刚尝试过。

该用户从未签到

 楼主| 发表于 2008-3-4 22:43:18 | 显示全部楼层
我刚参考了一点资料,准备用线程池来解决,处理下载队列.
我表达能力不好,不是替换,就是刷新的意思.一个Node的Image节点在用.net传输完成之前之后都是不可见或者空白的吧?在创建该Node的Image节点时我暂时还是开的线程来处理,依然是osgDB::readImageFile("http://..... .net");在启动程序后所有Image都在线程下载队列,就算队列已经下载完毕,所有这种节点看着依然是空白的或者不可见,就是怎么即时刷新这个Node的Image.
象这种需要使用到.net的Node是否应该是定义为osg:roxyNode?

该用户从未签到

发表于 2008-3-4 23:09:52 | 显示全部楼层
原帖由 WinMain 于 2008-3-4 22:43 发表
我刚参考了一点资料,准备用线程池来解决,处理下载队列.
我表达能力不好,不是替换,就是刷新的意思.一个Node的Image节点在用.net传输完成之前之后都是不可见或者空白的吧?在创建该Node的Image节点时我暂时还是开的线程 ...


应该不用特意使用ProxyNode,它的作用是指定从另一个文件载入节点。
下载完毕后仍然看不到节点的内容?我不清楚是否是线程的处理不妥当,可以用Image::data检查一下数据是否真的被载入了,还有将Image对象的DataVariance设置为DYNAMIC试一试

该用户从未签到

 楼主| 发表于 2008-3-5 12:23:56 | 显示全部楼层
用了线程池,问题已解决.感谢ARRAY的鼎立相助和讲解.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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