致谢
感谢网友提出这个问题。大家有问题也可以在评论区提出,有问必有答。如果涉及商业需求,可以联系作者133-2459-8743。
问题描述
今天有位网友问我怎么获取模型的读取进度。我记得72讲里面有讲过的,我就把代码发给他了。后来抱着负责任的态度我运行了一下,发现在OSG3.6.5版本中代码报错。于是我又重新改变思路写了一个,这个思路更安全。
功能
读取模型的时候,打印读取百分比。
本节资源
本文集包括本节所有资源包括模型代码都在此下载,按节的序号有文件或文件夹:
注意:务必使用浏览器打开:
链接:https://pan.baidu.com/s/13gwJLwo_LbRnN3Bl2NXXXw
提取码:xrf5
具体实现
第一步:先写个读取文件的callback,让readNodeFile的时候调一下我们的callback.
class ReadFileCB : public osgDB::Registry::ReadFileCallback
它是这样被调用的:
osgDB::Registry::instance()->setReadFileCallback(new ReadFileCB);
第二步:在callback中手动获取读写的插件,然后使用osgDB::ifstream istream(fileName.c_str(), std::ios::in | std::ios::binary);来读取文件,使用rw->readNode(istream);来读取结点。
第三步:起一个线程,实时的获取istream在整个文件中的位置,来求百分比。下面是线程类,先获取了总长度_length,然后在run里看看当前位置,当读到最后的时候线程退出。
class CRenderingThread : public OpenThreads::Thread
{
public:
CRenderingThread(osgDB::ifstream* fin) :_fin(fin)
{
fin->seekg(0, std::ifstream::end);
_length = fin->tellg();
fin->seekg(0, std::ifstream::beg);
};
virtual ~CRenderingThread() {};
virtual void run()
{
int pos = _fin->tellg();
while (pos < _length)
{
pos = _fin->tellg();
std::cout << 100.0*pos / _length<<"%%" << std::endl;
}
};
protected:
osgDB::ifstream* _fin;
int _length;
};
第四步:在callback里起线程:
osgDB::ifstream istream(fileName.c_str(), std::ios::in | std::ios::binary);
CRenderingThread crt(&istream);
crt.startThread();
if (istream)
{
std::cout << "Using default format readerwriter" << std::endl;
osgDB::ReaderWriter::ReadResult rr = rw->readNode(istream);
while (crt.isRunning()) {}
return rr;
}
齐活了,我是不是很厉害。