WorldWind源码剖析系列:WorldWind瓦片调度策略说明
1 基于源码的分析
首先我们来看WorldWind中摄像头变化相关的几个方法的内部逻辑。
1.1 NltTerrainAccessor. GetElevationAt
方法声明:public override float GetElevationAt(double latitude, double longitude, double targetSamplesPerDegree)。
当摄像头高度低于30万米时,才开始显示地面海拔高度值。根据摄像头的经纬度和视野范围(100/视野范围作为计算级别的标准,即每度坐标代表的高程数据跨度)计算取哪个级别、哪个瓦片的地形数据。进而得到该块的cache存放目录,读取cache文件得到高程矩阵。如果cache中没有该瓦片则从服务下载瓦片到cache中。最后计算当前经纬度的海拔高度值。
1.2 CameraBase. Update
方法声明:public virtual void Update(Device device)。
摄像头的视野范围算法,其中弧度计算公式为abs(sin(摄像头的高度/球的半径))*2;度计算公式为abs(sin(摄像头的高度/球的半径))*2*180/3.14。
1.3 QuadTileSet. Update
方法声明:public override void Update(DrawArgs drawArgs)。
如果摄像头的视野范围大于2* TileDrawDistance *LevelZeroTileSizeDegrees,则不显示任何瓦片,同时清空下载请求列表。遥感影像的LevelZeroTileSizeDegrees设置为2.25,地形为18,国界线为36,单位均为度。TileDrawDistance的值系统默认为3.5,即当视野的范围大于7个0级瓦片时,不进行加载显示。因为摄像头的前俯视角度默认为45度,所以图像的0级显示高度为2.25*7*111.13*0.5=875.149km(估算)。
2 调度策略
WorldWind按如下策略调度瓦片:
1) 启动新线程对球体进行遍历更新,根据摄像头的视野范围判断是否需要加载瓦片。如果需要,清空瓦片调度表里面不在当前显示区域范围内的瓦片,并进行瓦片调度
2) 瓦片更新跨度为4,即每次更新的瓦片队列为一个0级的6*6的瓦片矩阵,如下图所示。第一轮,更新加载摄像头经纬度所在瓦片,即下图中0所示瓦片;第二轮、三轮、四轮依次更新数字为1、2、3的瓦片。每轮的策略均为从左到右,从下到上。

图1瓦片更新轮次图
3) 更新单个瓦片的调度流程如下图所示。

图2单瓦片调度流程图
对于上图,在此做以下说明:
a) 初始时,在earth中有Images和Boundaries两种子集。系统对这两个子集遍历调度;
b) 调度表为系统要渲染的瓦片集合;
c) 下载最优算法:在屏幕中占有面积最大的瓦片优先调度下载;
d) 条件a:镜头的视野范围小于2*3.5*块大小并且镜头到块的中心点的距离要小于2.9*块大小*1.25并且块在显示区域范围内;
e) 条件b:镜头的视野范围小于3.5*块大小并且镜头到块的中心点的距离小于2.9*块大小并且块在显示区域范围内。该条件的业务含义是镜头视野范围每缩小一倍,显示级别增加一级,离镜头距离大于2.9个块大小的块,显示级别要低一级。
————————————————
版权声明:本文为CSDN博主「李明子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/free1985/article/details/77440207
WorldWind源码剖析系列:WorldWind瓦片调度策略说明的更多相关文章
- WorldWind源码剖析系列:星球类World
星球类World代表通用的星球类,因为可能需要绘制除地球之外的其它星球,如月球.火星等.该类的类图如下. 需要说明的是,在WorldWind中星球球体的渲染和经纬网格的渲染时分别绘制的.经纬网格的渲染 ...
- WorldWind源码剖析系列:星球球体的加载与渲染
WorldWind源码剖析系列:星球球体的加载与渲染 WorldWind中主函数Main()的分析 在文件WorldWind.cs中主函数Main()阐明了WorldWind的初始化运行机制(如图1所 ...
- WorldWind源码剖析系列:表面瓦片类SurfaceTile
表面瓦片类SurfaceTile描述星球类(如地球)表面纹理影像的瓦片模型.其类图如下. 表面瓦片类SurfaceTile包含的主要的字段.属性和方法如下: int m_Level;//该瓦片所属金字 ...
- WorldWind源码剖析系列:星球表面渲染类WorldSurfaceRenderer
星球表面渲染类WorldSurfaceRenderer描述如何渲染星球类(如地球)表面影像纹理.该类的类图如下. 星球类World包含的主要的字段.属性和方法如下: public const int ...
- WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore
影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.当划分完层次 ...
- WorldWind源码剖析系列:表面影像类SurfaceImage
表面影像类SurfaceImage描述星球类(如地球)表面纹理影像.该类的类图如下. 表面影像类SurfaceImage包含的主要的字段.属性和方法如下: string m_ImageFilePath ...
- WorldWind源码剖析系列:设置类SettingsBase
PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类Setting ...
- WorldWind源码剖析系列:挂件类Widgets
WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D ...
- WorldWind源码剖析系列:四叉树瓦片集合类QuadTileSet
四叉树瓦片集合类QuadTileSet是影像瓦片渲染的主要类.使用地形管理器来为3D地形渲染查询高程值.依赖于用来刷新基于经度.纬度.视角范围瓦片的更新线程.该类继承自可渲染对象类Renderable ...
- WorldWind源码剖析系列:四叉树瓦片类QuadTile
四叉树瓦片类QuadTile提供了对影像和地形数据的四叉树访问模型.该类的类图如下. 四叉树瓦片类QuadTile提供的主要字段.属性和方法简要描述如下: public QuadTileSet Qua ...
随机推荐
- 运营商业务系统基于 KubeSphere 的容器化实践
本篇文章是 KubeSphere 2020 年度 Meetup 上讲师宋磊分享内容整理而成. 大家好,我是宋磊,在运营商的一个科技子公司任职,主要做大数据业务.我主要负责公司的 IaaS 层和 Paa ...
- ROS入门21讲(4)
八.客户端Client的编程实现 1.话题模型 服务模型(客户端/服务器) 2.创建功能包 命令: $ cd ~/catkin_ws/src $ catkin_create_pkg learning_ ...
- 史上最全 Terraform 入门教程,助你无坑入门!
在云计算的浪潮中,基础设施管理变得越来越复杂.如何高效地配置和管理云资源,成为了每个开发者和运维工程师必须面对的挑战.Terraform,作为一种强大的基础设施即代码(IaC)工具,为我们提供了一种简 ...
- 每日学学Java开发规范,OOP规约(附阿里巴巴Java开发手册(终极版))
前言 每次去不同的公司,码不同的代码,适应不同的规范,经常被老大教育规范问题,我都有点走火入魔的感觉,还是要去看看阿里巴巴Java开发规范,从中熟悉一下,纠正自己,码出高效,码出质量. 想细看的可以去 ...
- 使用 ollama 在本地试玩 LLM
在 chatGPT 的推动下.LLM 简直火出天际,各行各业都在蹭.听说最近 meta 开源的 llama3 模型可以轻松在普通 PC 上运行,这让我也忍不住来蹭一层.以下是使用 ollama 试玩 ...
- 去除tinymce中粘贴的样式
import "tinymce/plugins/paste"; tinymce.init({ ...其他配置, plugins: ["paste"], past ...
- Wgpu图文详解(02)渲染管线与着色器
在本系列的第一篇文章中(<Wgpu图文详解(01)窗口与基本渲染>),我们介绍了如何基于0.30+版本的winit搭建Wgpu的桌面环境,同时也讲解了关于Wgpu一些基本的概念.模块以及架 ...
- 使用PYNQ生成PWM波控制舵机/步进电机/机械臂
使用PYNQ生成PWM波控制舵机/步进电机/机械臂 在开始这个工程之前,你需要PYNQ-Z2的板卡文件,约束文件,原理图作为参考,你可以在我上传的资源里下载. 当然,这个工程也适用于PYNQ-Z1,只 ...
- P4119 Ynoi2018 未来日记
P4119 Ynoi2018 未来日记 lxl 出的题好 duliu 啊. 感谢来自 fr200110217102 的博客 题解 P4119 [Ynoi2018未来日记]. 下标分块+值域分块+并查集 ...
- Python基础:Python的变量和对象
一.基本原理 Python中一切都是对象,变量中存放的是对象的引用.这是一个普遍的法则.我们举个例子来说,Python是如何来处理的. x = 'blue' y = 'green' z = x 当p ...