目标:(二十三)中问题75
请求经过PagerLoader加载时初始化为RUNNING
osgEarthDrivers/engine_rex/Loader.cpp
bool
PagerLoader::load(Loader::Request* request, float priority, osg::NodeVisitor& nv)
{
request->setState(Request::RUNNING);
}
在PagerLoader将请求加入合并队列_mergeQueue时设为MERGING
osgEarthDrivers/engine_rex/Loader.cpp
bool
PagerLoader::addChild(osg::Node* node)
{
_mergeQueue.insert( req );
req->setState( Request::MERGING );
}
在PagerLoader遍历合并队列,执行完请求的apply()时设置为FINISHED
osgEarthDrivers/engine_rex/Loader.cpp
void
PagerLoader::traverse(osg::NodeVisitor& nv)
{
for(count=0; count < _mergesPerFrame && !_mergeQueue.empty(); ++count)
{
Request* req = _mergeQueue.begin()->get();
if ( req && req->_lastTick >= _checkpoint )
{
OE_START_TIMER(req_apply);
req->apply( getFrameStamp() );
double s = OE_STOP_TIMER(req_apply);
req->setState(Request::FINISHED);
}
}
}
PagerLoader在遍历请求时,如果存在以下情况则将请求状态会设为IDLE,并从请求列表中删除该请求。(1)请求的状态已经设置为FINISHED(为什么不在设置FINISHED状态时直接删除请求呢);(2)超过两帧都没有将请求放入合并队列;(3)超过1800帧都没有从合并队列里处理完。
osgEarthDrivers/engine_rex/Loader.cpp
void
PagerLoader::traverse(osg::NodeVisitor& nv)
{
// Deal with completed requests:
if ( req->isFinished() )
{
//OE_INFO << LC << req->getName() << "(" << i->second->getUID() << ") finished." << std::endl;
req->setState( Request::IDLE );
if ( REPORT