osgEarth的Rex引擎原理分析(二十三)PagerLoader的traverse过程详解

2023-11-05

目标:(十七)中问题48

主要包含两个过程:

1、已处理过请求的加载

这是真正意义上的加载,刚创建出来的请求是从缓存或文件没有关联影像、高程等数据的,需要经过多线程处理后才有数据(详见(十七))。对于这些处理过的请求,在PagerLoader的更新遍历traverse中会进行实质性的处理。具体如下:

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);
                }

                _mergeQueue.erase( _mergeQueue.begin() );
            }
}

(1)限定处理的请求数目

在PagerLoader创建时就会设置这个数目(详见(十四))

(2)对请求的时间合法性进行判断

首先是_checkpoint,它是在rex引擎refresh的时候调用PagerLoader的clear方法设置的,是一个64位的高精度整型,不同的编译器定义不同。这个值只设置一次,后面不会再修改。

osgEarthDrivers/engine_rex/Loader.cpp
void
PagerLoader::clear()
{
    // Set a time checkpoint for invalidating old requests.
    _checkpoint = osg::Timer::instance()->tick();
}

这里的tick函数为:

osg/Timer.cpp
Timer_t Timer::tick() const
{
    LARGE_INTEGER qpc;
    if (QueryPerformanceCounter(&qpc))
    {
        return qpc.QuadPart;
    }
}

这里的QueryPerformanceCounter为windows的API函数,用于获取高精度的时间。感觉这里没有必要采用这么高精度的时间吧?

再者是请求的_lastTick,这个值在PagerLoader的load函数中设置,为系统的当前时间。

只有请求的_lastTick在PagerLoader的_checkpoint之后才有意义。

(3)应用请求apply()

(3.1)比较请求的瓦片模型和地图的版本是否一致

请求的瓦片模型_dataModel在请求的流转过程中由请求的invoke函数创建,是根据_mapFrame中的版本号来的。地图的版本号初始值为-1,在添加、删除、移动图层后,地图的版本号都会增加1。

(3.2)将瓦片模型合并到瓦片节点中

(3.2.1)合并颜色(影像),根据osgEarth::TerrainTileModel中的颜色层来合并,主要设置通道中颜色采样器的纹理和矩阵

(3.2.2)合并高程,根据osgEarth::TerrainTileModel中的高程层来合并,主要设置通道中高程采样器的纹理和矩阵

(3.2.3)合并法线,根据osgEarth::TerrainTileModel中的法线层来合并,主要设置通道中法线采样器的纹理和矩阵

(3.2.4)合并其它共享层,根据osgEarth::TerrainTileModel中的共享层来合并,主要设置通道中共享采样器的纹理和矩阵

(3.2.5)合并细分层Patch(其实这里什么工作也没做),根据osgEarth::TerrainTileModel中的细分层来合并

(3.2.6)更新子瓦片节点

主要是更新子瓦片的通道中采样器的纹理和矩阵,注意这里的矩阵经过了缩放和平移修正

如果子瓦片还有子瓦片则继续向下更新

(3.2.7)通知地形节点添加了瓦片

(3.3)设置瓦片节点请求信息数据标志TileNode::setDirty

(4)设置请求的状态为已完成Request::FINISHED

(5)从合并请求队列_mergeQueue中移除该请求,注意在请求队列_requests中还存在

2、对一些请求进行裁剪

遍历所有请求列表_requests中的请求,对每一个请求执行如下操作:

(1)如果请求完成(状态为FINISHED),设置请求状态为IDLE,更新寄存器中瓦片的活动记录,从请求列表中删除请求。

(2)如果请求还没有放入请求合并队列_mergeQueue,并且请求的帧号和当前的帧号差值超过2,更新寄存器中瓦片的活动记录,从请求列表中删除请求。

(3)如果请求还已放入请求合并队列_mergeQueue,并且请求的帧号和当前的帧号差值超过1800,更新寄存器中瓦片的活动记录,从请求列表中删除请求。

3、执行父节点的更新遍历

 

 

 

 

 

 

 

 

待继续分析列表:

9、earth文件中都有哪些options((九)中问题)

10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)

11、rex地理信息引擎的四梁八柱((九)中问题)

12、osgEarth::TerrainEngineNode中setMap方法作用((十二)中问题)

13、RexTerrainEngineNode中_mapFrame的作用((十二)中问题)

14、地形变形(Terrain morphing)((十二)中问题)

15、地球瓦片过期门限的含义((十二)中问题)

16、高分辨率优先的含义((十二)中问题)

17、OSGEARTH_DEBUG_NORMALS环境变量的作用((十二)中问题)

18、活跃瓦片寄存器的作用((十二)中问题)

19、资源释放器子节点的作用((十二)中问题)

20、共享几何图形池子节点的作用((十二)中问题)

21、分页瓦片加载器子节点的作用((十二)中问题)

22、分页瓦片卸载器子节点的作用((十二)中问题)

23、栅格化器子节点的作用((十二)中问题)

24、地形子节点的作用((十二)中问题)

25、绑定渲染器的作用((十二)中问题)

26、地图回调函数的作用((十二)中问题)

27、如何将地图图层添加到rex引擎中((十二)中问题)

28、选择信息的作用((十二)中问题)

29、瓦片包围盒修改回调函数的作用((十二)中问题)

30、刷新rex引擎((十二)中问题)

31、刷新边界作用((十二)中问题)

32、osgEarth::Metrics类的意义((十四)中问题)

33、请求合并队列_mergeQueue((十四)中问题)

34、分页瓦片加载器在更新遍历时对请求处理过程((十四)中问题)

35、分页瓦片加载器在更新遍历时对已处理请求裁剪过程((十四)中问题)

36、已处理的请求队列_requests((十四)中问题)

37、DatabasePager中的_fileRequestQueue和_httpRequestQueue((十六)中问题)

38、瓦片请求的生成到处理过程详解((十六)中问题)

39、瓦片节点TileNode的创建过程((十七)中问题)

40、request请求加载瓦片优先级的含义((十七)中问题)

41、request的_internalHandle的作用((十七)中问题)

42、DatabaseRequest中_objectCache含义((十七)中问题)

42、osgEarth的多线程分析((十七)中问题)

43、osgEarth的缓存及其结构((十七)中问题)

44、DatabaseThread从缓存加载数据过程((十七)中问题)

45、DatabaseThread从文件加载数据过程((十七)中问题)

46、决定创建TileNode的时机条件((十七)中问题)

47、TerrainEngineNode的createTileModel过程详解((十七)中问题)

48、DatabaseThread中CompileSet的含义((十七)中问题)

48、PagerLoader的traverse过程详解((十七)中问题)

49、DatabaseThread的run过程详解((十七)中问题)

50、LoadTileData的invoke过程详解((十七)中问题)

51、TileNode的cull过程详解((十七)中问题)

52、遮罩生成器osgEarth::Drivers::RexTerrainEngine::MaskGenerator((十八)中问题)

53、RexTerrainEngineNode::traverse过程详解((十八)中问题)

54、TileNode节点下的场景树分析((十八)中问题)

55、地形瓦片大小尺寸和LOD的关系((十八)中问题)

56、TileNode的_tileKeyValue作用((十八)中问题)

57、TileNode的_morphConstants作用((十八)中问题)

58、TileNode的_stitchNormalMap作用((十八)中问题)

59、TileNode的_renderModel作用((十八)中问题)

60、初始化高程栅格过程详解((十八)中问题)

61、LoadTileData中的CreateTileModelFilter作用((十八)中问题)

62、TileNode节点何时会从场景树中移除((十八)中问题)

63、osgEarth::Map的Profile创建过程((二十)中问题)

64、osgEarth::TerrainTileModelFactory添加颜色层和影像层的区别((二十一)中问题)

65、osgEarth::PatchLayer修补层的作用((二十一)中问题)

66、osgEarth::TerrainLayer中的_memCache(osgEarth::MemCache)详解((二十一)中问题)

67、osgEarth::Layer::RenderType图层渲染类型的作用((二十一)中问题)

68、osgEarth::TerrainLayer中TileSource的作用((二十一)中问题)

69、earth文件没有设置高程图层会不会有默认高程层(高程均为0)((二十一)中问题)

70、TerrainTileModelFactory::addColorLayers过程详解((二十一)中问题)

71、TerrainTileModelFactory::addElevation过程详解((二十一)中问题)

72、osgearth中可能用到的几个全局实例对象(osgDB::Registry osgEarth::Registry osg::Timer osg::DisplaySetting)((二十三)中问题)

73、osgEarth::Map::addLayer过程详解((二十三)中问题)

74、TileNode::setDirty过程详解((二十三)中问题)

75、请求四个状态的含义(IDLE RUNNING MERGING FINISHED)((二十三)中问题)

76、什么时候删除TileNode节点,不会一直增加吧((二十三)中问题)

77、寄存器中请求状态活动记录的含义Registry::instance()->endActivity( req->getName() )((二十三)中问题)

78、瓦片TileNode的生命周期流程详解((二十三)中问题)

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

osgEarth的Rex引擎原理分析(二十三)PagerLoader的traverse过程详解 的相关文章

随机推荐