osgEarth的Rex引擎原理分析(十七)瓦片请求的生成到处理过程详解

本文详细分析了osgEarth的Rex引擎中,从TileNode在渲染遍历时产生请求到最终瓦片数据加载的过程。涉及TileNode、PagerLoader、DatabasePager、DatabaseThread等组件,阐述了请求的生成、转换、处理和加载的步骤,揭示了osgEarth内部的多线程管理和数据加载机制。
摘要由CSDN通过智能技术生成

目标:(十六)中问题38

瓦片请求的大概过程是这样的:

1、osgEarth::Drivers::RexTerrainEngine::TileNode在渲染遍历时产生LoadTileData请求,将请求传递给DatabsePager改造成DatabaseRequest请求后(LoadTileData的ID会写入字符串放入DatabaseRequest中),将此请求放入了DatabasePager的_fileRequestQueue队列中

2、DatabasePager的运行线程DatabaseThread又将DatabaseRequest请求部分属性进行设置后(真正的数据获取就在这里完成,调用PagerLoader将请求的瓦片数据(高程、影像等)放入LoadTileData请求中),放入DatabasePager的_dataToMergeList的队列中。

3、在更新遍历DatabasePager时,将其_dataToMergeList列表中的DatabaseRequest请求经过转换成LoadTileData请求后,放入瓦片分页加载器PagerLoader的_mergeQueue队列中

4、在更新遍历时瓦片分页加载器处理_mergeQueue中的请求,构建TileNode的渲染模型_renderModel,TileRenderModel主要记录渲染各个瓦片的通道,一个通道对应一个可视化层(颜色、高层、法线等),每个瓦片TileNode都包含一个TileRenderModel。这样就做好了绘制瓦片的数据准备工作。

5、对瓦片进行绘制,绘制流程见 osgEarth的Rex引擎原理分析(四十五)TileNode绘制过程详解

 

 

下面围绕着每个过程中的子过程有哪些,请求是如何在其中运转腾挪的这么一个思路来详细展开。

1、osgEarth::Drivers::RexTerrainEngine::TileNode在渲染遍历时产生请求

(1)在渲染遍历时,TileNode通过PagerLoader加载请求

osgEarthDrivers/engine_rex/TileNode.cpp
void
TileNode::load(TerrainCuller* culler)
{  
    _context->getLoader()->load( _loadRequest.get(), priority, *culler );
}

这里的_context为rex引擎RexTerrainEngineNode中设置的(见(十二)),在TileNode执行create的时候赋值。getLoader就是获取分页瓦片加载器PagerLoader,然后由PagerLoader执行load方法加载请求。

这里的_loadRequest为LoadTileData对象,是TileNode的成员变量,在TileNode执行create的时候赋值。从代码可以看出,创建瓦片节点时,相应的高程和影像数据并没有同时加载进来,而是通过多线程处理请求的方式来加载。

osgEarthDrivers/engine_rex/TileNode.cpp
void
TileNode::create(const TileKey& key, TileNode* parent, EngineContext* context)
{
    _context = context;

    _loadRequest = new LoadTileData( this, context );
    _loadRequest->setName( _key.str() );
    _loadRequest->setTileKey( _key );
}

这里的priority意思为加载瓦片的优先级

这里的culler为裁剪遍历器

(2)PagerLoader再通过DatabasePager处理请求

osgEarthDrivers/engine_rex/Loader.cpp
bool
PagerLoader::load(Loader::Request* request, float priority, osg::NodeVisitor& nv)
{
    request->setState(Request::RUNNING);
    // remember the last tick at which this request was submitted
    request->_lastTick = osg::Timer::instance()->tick();  

    // update the priority, scale and bias it, and then normalize it to [0..1] range.
    unsigned lod = request->getTileKey().getLOD();
    float p = priority * _priorityScales[lod] + _priorityOffsets[lod];            
    request->_priority = p / (float)(_numLODs+1);

    request->setFrameNumber( fn );

    request->_loadCount++;



    char filename[64];
    sprintf(filename, "%u.osgearth_rex_loader", request->_uid);

    nv.getDatabaseRequestHandler()->requestNodeFile(
            filename,
            _myNodePath,
            request->_
osgEarth是一个开源的地理信息系统,并提供一种以瓦片地图的方式呈现地图数据,这个模块被称为osgEarth Map Tiles。osgEarth Map Tiles支持多种矢量和栅格数据格式,如GeoTIFF、JPEG等。使用该模块可以创建多种地图应用程序,如三维地图、三维飞行、路线规划、地理信息分析等。 osgEarth Map Tiles将地球表面划分为许多小块,每个小块称为“瓦片”。这些瓦片通常是正方形的或长方形的并包含嵌入数据源的特定地区的地图数据。osgEarth Map Tiles使用这些瓦片地图在线或离线上,以安全、高效的方式呈现地图信息。 osgEarth Map Tiles在瓦片地图方面有许多优点。首先,它可以根据需要缩放地图,对于分辨率敏感的可视化项目特别有用。其次,它可以提高地图加载速度,因为只加载所需瓦片,而不是整个地图数据。此外,osgEarth Map Tiles可与其他插件和模块一起使用,可允许用于许多不同的应用程序和应用领域,如教育、城市规划、气象、环境等。 尽管osgEarth Map Tiles特别适合于许多空间可视化项目,但它在实践中并非不受限制。例如,如果需要对整个地球表面进行操作,则必须下载整个地球的数据集。osgEarth Map Tiles还需要一些学习和实践,以了解如何连接和使用多种数据源以及如何正确地离线保存和管理数据。如果正确使用,osgEarth Map Tiles可以成为开发者提高应用程序质量和用户体验的强大工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值