osgEarth的Rex引擎原理分析(三十一)osgEarth::TerrainLayer中的_memCache(osgEarth::MemCache)详解

2023-11-14

目标:(二十一)中的问题66

继承关系:

osgEarth::Cache

    osgEarth::MemCache

cache中的数据是通过cachebin来实现存放的,cachebin有两种,继承关系为:

osgEarth::CacheBin

     MemCacheBin(osgEarth/MemCache.cpp)

在osgEarth::Cache中有维护这osgEarth::CacheBin的map表,osgEarth::CacheBin其实就是最终的缓存数据,具体数据由其成员osg::ref_ptr<osg::Referenced> _metadata来存放

osgEarth::MemCache中的CacheBin本质上是MemCacheBin,具体数据是在其MemCacheLRU _lru中存放,MemCacheLRU(typedef LRUCache<std::string, MemCacheEntry> MemCacheLRU)是一个osgEarth::LRUCache(Least-recently-used最近最少使用缓存类,很多操作系统中都有此种缓存类),值得注意的是LRUCache中既有map又有list,他们存放的数据是相同的,只所以要这样做,是因为map方便查找和存放,list方便定位较早的元素。

osgEarth/MemCache.cpp
    typedef std::pair<osg::ref_ptr<const osg::Object>, Config> MemCacheEntry;
    typedef LRUCache<std::string, MemCacheEntry> MemCacheLRU;
    struct MemCacheBin : public CacheBin
    {
        MemCacheLRU _lru;
    };

缓存的默认大小为16.

 

在osgDB::DatabasePager::DatabaseThread::run中处理请求时,会往图层的缓存中写入瓦片信息,在创建瓦片模型时会从缓存中读取缓存信息。

写入缓存过程

osgDB/DatabasePager.cpp
void DatabasePager::DatabaseThread::run()
{
            // assume that readNode is thread safe...
            ReaderWriter::ReadResult rr = readFromFileCache ?
                        fileCache->readNode(fileName, dr_loadOptions.get(), false) :
                        Registry::instance()->readNode(fileName, dr_loadOptions.get(), false);
}
osgEarth/MemCache.cpp
        bool write( const std::string& key, const osg::Object* object, const Config& meta, const osgDB::Options* writeOptions)
        {
            if ( object ) 
            {
                osg::ref_ptr<const osg::Object> cloned = osg::clone(object, osg::CopyOp::DEEP_COPY_ALL);
                _lru.insert( key, std::make_pair(cloned.get(), meta) );
                return true;
            }
            else
                return false;
        }

读取缓存过程

osgDB/DatabasePager.cpp
void DatabasePager::DatabaseThread::run()
{
            // assume that readNode is thread safe...
            ReaderWriter::ReadResult rr = readFromFileCache ?
                        fileCache->readNode(fileName, dr_loadOptions.get(), false) :
                        Registry::instance()->readNode(fileName, dr_loadOptions.get(), false);
}
osgEarth/MemCache.cpp
        ReadResult readObject(const std::string& key, const osgDB::Options*)
        {
            MemCacheLRU::Record rec;
            _lru.get(key, rec);

            // clone required since the cache is in memory

            if ( rec.valid() )
            {
                //OE_INFO << LC << "hits: " << _lru.getStats()._hitRatio*100.0f << "%" << std::endl;

                return ReadResult( 
                   osg::clone(rec.value().first.get(), osg::CopyOp::DEEP_COPY_ALL),
                   rec.value().second );
            }
            else
            {
                //OE_INFO << LC << "hits: " << _lru.getStats()._hitRatio*100.0f << "%" << std::endl;
                return ReadResult();
            }
        }

这个缓存和文件系统缓存还不一样,这里缓存在内存里,因而速度会更快。

 

缓存MemCacheBin在rex引擎的setMap中会间接创建

 

 

待继续分析列表:

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的生命周期流程详解((二十三)中问题)

79、rex引擎如何将瓦片构造成地球形状((二十五)中问题)

80、高程、影像文件格式详解((二十五)中问题)

81、TileNode的merge过程详解((二十六)中问题)

82、osgEarth支持的空间参考坐标系详解(osgEarth::SpatialReference、osgEarth::CubeSpatialReference、osgEarth::TangentPlaneSpatialReference)((二十九)中问题)

83、osgEarth地球椭球体ellipsoid 大地基准面datum 地图投影Projection详解((二十九)中问题)

84、空间参考坐标系和坐标系统类型的关系(geocentric projected)((二十九)中问题)

85、proj4是什么((二十九)中问题)

86、为什么要删除设置过的垂直水准面((二十九)中问题)

87、osgEarth如何对投影坐标系和大地坐标系进行显示处理的((二十九)中问题)

88、TileNode的节点构成,一个surface、tilenode((三十)中问题)

89、MapFram和MapInfo的关系((三十)中问题)

90、ModifyBoundingBoxCallback的使用时机和场合((三十)中问题)

91、MapFrame为什么要单独存放高程层_elevationLayers,而不是放在图层_layers中((三十)中问题)

92、MapFrame和Map中高程池的作用osg::ref_ptr<ElevationPool> _elevationPool((三十)中问题)

93、osgEarth::Drivers::RexTerrainEngine::TileDrawable分析((三十)中问题)

 

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

osgEarth的Rex引擎原理分析(三十一)osgEarth::TerrainLayer中的_memCache(osgEarth::MemCache)详解 的相关文章

随机推荐

  • 讯连科技威力导演20中文版

    威力导演也叫做CyberLink PowerDirector 是一款非常专业实用的非线性视频编辑神器 这款软件体积小巧 功能强大 即使是初学者也能够轻松使用 拥有入门初学者和专业工作者所需要的各种功能 能够帮助初学者快速入门 让专业工作者处
  • docker 安装与配置

    一 环境准备 IP 主机名 操作系统版本 docker版本 192 168 168 128 master01 CentOS Linux release 7 9 2009 Core docker 20 10 15 tgz 二 安装 安装包获取
  • 【超全汇总】VS2019+Qt15插件、安装、组件说明/问题解答/Qt实战(缺失Qtgui,无法打开.ui文件)

    本文介绍如何在VS2019中使用Qt 一 Qt安装 1 1 安装组件及说明 1 2 安装QT visual Studio Tool拓展 1 3 重启 配置插件 1 4 Qt实战演练 问题汇总 缺失Qtgui 无法打开 ui文件 由于版本兼容
  • 计算机系统课程 笔记总结 CSAPP第五章 优化程序性能(5.1-5.14)

    GitHub计算机系统CSAPP课程资源 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 1 2 2 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 3 2 4 计算机系统课程 笔记总结 CSAPP第三章
  • R语言嵌套的ifelse语句:根据表达式结果执行不同的语句块

    R语言嵌套的ifelse语句 根据表达式结果执行不同的语句块 在R语言中 我们可以使用嵌套的ifelse语句来根据条件的结果执行不同的语句块 ifelse语句的结构如下 ifelse condition true expr false ex
  • C++数学函数库

    abs 原型 extern int abs int x 用法 include
  • MATLAB 学习笔记(1)MATLAB 矩阵的基本操作

    目录 MATLAB矩阵的基本操作 MATLAB引用一个矩阵的元素 MATLAB删除行或列矩阵 MATLAB矩阵的基本操作 在MATLAB中创建矩阵有以下规则 矩阵元素必须在 内 矩阵的同行元素之间用空格 或 隔开 矩阵的行与行之间用 或回车
  • 大据数技术之高频面试题8.0.9

    尚硅谷大数据技术之高频面试题 作者 尚硅谷大数据研发部 配套视频 版本 V8 0 尚硅谷大数据研发部 目录 第1章 项目涉及技术 12 1 1 Linux Shell 12 1 1 1 Linux常用高级命令 12 1 1 2 Shell常
  • 【Java】如何通过一次请求获取多张图片

    背景 一次请求响应一张图片 这是我们熟练的业务 就是用户访问我们编写的接口 后端服务就响应一张图片给网页 也就是一个url对应的就是一个图片资源 下面是具体的业务代码和注释 Controller public class ImageCont
  • 数学建模竞赛论文模板&注意点

    1 摘要 摘要是论文内容不加注释和评论的简短陈述 其作用是使读者不阅读论文全文即能获得必要的信息 一般说来 摘要应包含以下五个方面的内容 研究的主要问题 建立的什么模型 用的什么求解方法 主要结果 简单 主要的 自我评价和推广 数学建模竞赛
  • Element-UI日期组件支持时间范围以及限制选择时间跨度

    最近项目遇到一个功能 用户只能查询最近180天的订单 而且每次只能选择7天范围的时间跨度 类似下图所示 解释 最近180天很好理解 就是往前推180天 每次只能选7天 是指选择的是10号 则以10号为基准点前推6天则是4号后推6天则是16号
  • ubuntu16.04如何卸载干净python

    可以使用以下步骤卸载python 确保当前目录下没有任何python文件 使用terminal输入sudo apt get purge python 输入sudo apt get autoremove 如果需要 可以清除所有python的配
  • 20道高频React面试题(附答案)

    React 中 refs 干嘛用的 Refs 提供了一种访问在render方法中创建的 DOM 节点或者 React 元素的方法 在典型的数据流中 props 是父子组件交互的唯一方式 想要修改子组件 需要使用新的pros重新渲染它 凡事有
  • 4. 从0开始学ARM-ARM指令,移位、数据处理、BL、机器码

    到底什么是Cortex ARMv8 arm架构 ARM指令集 soc 一文帮你梳理基础概念 科普 关于ARM指令用到的IDE开发环境可以参考下面这篇文章 1 从0开始学ARM 安装Keil MDK uVision集成开发环境 2 从0开始学
  • 浅谈语义主题计算

    浅谈语义主题计算 摘要 两篇文档是否相关往往不只决定于字面上的词语重复 还取决于文字背后的语义关联 对语义关联的挖掘 可以让我们的搜索更加智能化 本文着重介绍了一个语义挖掘的利器 主题模型 主题模型是对文字隐含主题进行建模的方法 它克服了传
  • element-ui table 改变一行的样式 row-style 失效问题

    如题 最新版本的element ui 关于table row style 失效 之前是return str 样式字符串
  • 40 个免费的面向编程初学者的视频教程

    来源 https javascript plainenglish io top 40 free programming courses for beginners bc39253e784c 今天 我将跟大家分享40个免费的编程视频教程 大家
  • 计算机图形学【GAMES-101】13、光场、颜色与感知

    快速跳转 1 矩阵变换原理Transform 旋转 位移 缩放 正交投影 透视投影 2 光栅化 反走样 傅里叶变换 卷积 3 着色计算 深度缓存 着色模型 着色频率 4 纹理映射 重心坐标插值 透视投影矫正 双线性插值MipMap 环境光遮
  • 使用git在gitlab上拉取代码的方法

    使用git在gitlab上拉取代码的方法 最近在项目中用到了gitlab 他是一个类似于github的代码托管工具 因为是第一次使用还不太熟悉 所以在此记录一下 1 首先需要使用github的注册账号登录gitlab 查看右上角用户头像处的
  • osgEarth的Rex引擎原理分析(三十一)osgEarth::TerrainLayer中的_memCache(osgEarth::MemCache)详解

    目标 二十一 中的问题66 继承关系 osgEarth Cache osgEarth MemCache cache中的数据是通过cachebin来实现存放的 cachebin有两种 继承关系为 osgEarth CacheBin MemCa