Cesium 影像加载的TileReplacementQueue技术

本文以分析QuadtreePrimitive及相关影像内容,讨论一些流程和方法。影像和地形是Cesium的基础内容,但是有时候感觉这部分的加载和渲染效率并不高。

TileReplacementQueue是一个非常神奇的类,我自己研究了小半天。虽然结构简单,但是它可以呈现比较丰富的形态。可以学习学习。

TileReplacementQueue这个队列是瓦片可以被替换的队列,越在后面的,越是价值不高的。

对了,本文可以结合源码阅读。本文如果直接读,可以看懂,但可能感受不到源码的威力(复杂性或者说莫名其妙的设计)。

添加队列

  1. markTileRendered(item)方法,它会把这个瓦片作为当前最宝贝的(最前面)的。这个item来自要加载的队列。及来自当前的渲染队列。
  2. 来自渲染队列的情况,越是顶层(Level越小的)优先级越低。反之依然。也就是顶层的瓦片被替换的优先级比较高。当然需要被渲染的优先级大于不需要被渲染的。
  3. 来自更新队列的情况,其整体优先级大于渲染队列的。更新队列包括tileLoadQueueHigh、tileLoadQueueMedium、tileLoadQueueLow,如果有tileLoadQueueHigh,那么就不会把tileLoadQueueMedium放到队列中。

    4166945236fd4428a5595751dac7e917.png

循环队列

  1. 每一轮帧循环,如果没有更新,没有移动视角的情况下,指针会从Tail走向Head。队列会向手里的扑克一样从下面一张张抽到上面。
  2. 每一轮帧循环,如果有更新,有移动视角的情况下,那么队列中必然会出现有些Tile不可见,因此他们并没有像前面那样被抽到前面,而是放到了后面。6eb69eb970924f30a2e177d02db42629.png

队列分组

  1. _lastBeforeStartOfFrame这个上次队列的第一个(head)。而head一般是当前渲染的众多叶子节点的一个。5235494205c743ffbd159d448301ffec.png
  2. 如果_lastBeforeStartOfFrame是可见的,在本轮检查后,_lastBeforeStartOfFrame会是空的。因为_lastBeforeStartOfFrame被从底层抽到最前面的时候,_lastBeforeStartOfFrame被指向它的Next。在最底的时候Next为空,因此_lastBeforeStartOfFrame就变空了。24dea49978324797bcd33c22af13a0f9.png
  3. _lastBeforeStartOfFrame为空,则说明上次渲染的叶子节点可见。
  4. 如果_lastBeforeStartOfFrame不为空,则说明上次渲染的叶子节点不可见。
  5. 如果_lastBeforeStartOfFrame不为空,那么它后面不可见的Tile一般都是不可见的。

0cb56de5b6444280988293238e846903.png

移除不可见的

  1. trimTiles方法就是移除队列的后面不可见的瓦片。
  2. _lastBeforeStartOfFrame可以保证在trimTiles方法中不要清除_lastBeforeStartOfFrame之前的瓦片。因为_lastBeforeStartOfFrame之前的瓦片是要被渲染或者更新加载的瓦片。而_lastBeforeStartOfFrame之后的瓦片是当下不可见的瓦片。

总结

简简单单的一个类,内部隐含了非常多的策略逻辑,不得不佩服设计者的巧妙之处。虽然分析起来比较头疼。

但_lastBeforeStartOfFrame的设计总感觉莫名其妙。因为_lastBeforeStartOfFrame只能指向其中一个叶子瓦片节点。而当前渲染场景有很多叶子节点。仅当此叶子节点不可见才能被移除,实属“点兵点将,点到谁就是谁”,有点随意或不全面。

另外,TileReplacementQueue是每帧都进行分析,一般可见域有120个左右的瓦片,计算量还是有的。这种密集式计算是否得当也是需要深度分析的。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/452707.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ACH支付详解,北美电商为何偏爱这一方式

ACH支付在北美广泛应用,低成本、可逆、安全、便捷。ZohoBooks财务管理软件支持ACH,可自动化处理收付款,提高效率并减少错误。适合北美电商客户使用,支持多货币和税务法规。 一、什么是ACH支付? ACH支付是一种通过名为…

②PROFINET转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 PROFINET 转 Modbus TCP (接上一章) 配置使用 与 PROFINET 主站进行组态说明 这里介绍与西门子 PLC 的…

大数据-180 Elasticsearch - 原理剖析 索引写入与近实时搜索

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

Docker-Consul概述以及集群环境搭建

文章目录 一、Docker consul概述二、consul 部署1.consul服务器2.registrator服务器(客户端)2.consul-template(在consul服务器)3.consul 多节点 一、Docker consul概述 容器服务更新与发现:先发现再更新,…

leetcode289:生命游戏

根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 &am…

ClickFix攻击活动升级:可通过虚假谷歌会议画面传播恶意软件

最近,研究人员报告了一种新的 ClickFix 攻击活动,主要通过诱骗用户访问显示虚假连接错误的欺诈性 谷歌会议的页面,继而借此传播信息窃取恶意软件,主要针对 Windows 和 macOS 操作系统。 ClickFix是网络安全公司Proofpoint在5月份…

016集——c# 实现CAD类库 与窗体的交互(CAD—C#二次开发入门)

第一步:搭建CAD类库dll开发环境。 第二步:添加窗体 第三步:添加控件 第四步:双击控件,在控件点击方法内输入代码 第五步:在主程序内实例化新建的form类,并弹窗form窗体 第六步:CAD命…

第五届人工智能与教育国际学术会议(ICAIE 2024)

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网:https://ais.cn/u/vEbMBz提交检索:EI Compendex、IEEE Xplore、Scopus 三、大会介绍 第五届人工智能与教育国际学术会议&#x…

学习虚幻C++开发日志——TSet

TSet 官方文档:虚幻引擎中的Set容器 | 虚幻引擎 5.5 文档 | Epic Developer Community (epicgames.com) TSet 是通过对元素求值的可覆盖函数,使用数据值本身作为键,而不是将数据值与独立的键相关联。 默认情况下,TSet 不支持重…

大数据-168 Elasticsearch 单机云服务器部署运行 详细流程

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

基于stm32的4G模块点灯实验

led模块功能封装 #include "led.h" #include "sys.h"//初始化GPIO函数 void led_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOB_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.Pin GPIO_PIN_8 | GPIO_PIN_9;gpio_inits…

Linux基本指令一眼看懂(简洁表示)

首先先声明是简单表示,如果要全指令有链接 1. ls 指令 ls [选项] [文件/目录]常用选项: -l: 以长格式列出文件和目录的详细信息。 -a: 显示所有文件,包括隐藏文件(以.开头的文件)。 -h: 以人类可读的格式显示文件大小。 示例: …

基于stm32的esp8266的WIFI控制风扇实验

实验案例WIFI控制风扇 项目需求 电脑通过esp8266模块远程遥控风扇。 项目框图 ​ 风扇模块封装 #include "sys.h" #include "fan.h"void fan_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟…

数据库知识点整理

DDL DDL-数据库操作 show databases ------------ 查看所有数据库 select database(); ----------查看当前数据库 create database 数据库名;---- 创建数据库 use 数据库名; --------------使用数据库 drop database 数据库名;--…

day02_计算机常识丶第一个程序丶注释丶关键字丶标识符

计算机常识 计算机如何存储数据 计算机世界中只有二进制。那么在计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。 进制 进制也就是进位计数制,是人为定义的带进位的计数方法 实例: // 在java 中 可以使用不同…

[PHP]Undefined index错误只针对数组

1、示例一 <?php $a null; var_dump($a[name]); 结果&#xff1a;无报错 2、示例二 <?php $a []; var_dump($a[name]);结果&#xff1a;报错

【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…

JMeter 中两大高级线程组的区别与应用

一、JMeter 中的高级线程组概述 最近群里的测试小伙伴在问在 JMeter 中&#xff0c;“jpgc - Ultimate Thread Group”和“jpgc - Stepping Thread Group 阶梯加压”有哪些区别和实际应用场景有哪些&#xff1f;所以这里也跟大家分享一下 JMeter 作为一款强大的性能测试工具&a…

Java项目-基于Springboot的应急救援物资管理系统项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

基于SpringBoot网上超市的设计与实现(论文+源码)_kaic

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此超市商品销售信…