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个左右的瓦片,计算量还是有的。这种密集式计算是否得当也是需要深度分析的。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙HarmonyOS开发:应用权限的基本概念及如何申请应用权限详细介绍

文章目录 一、访问控制二、应用权限1、应用权限管控2、权限使用的基本原则3、授权方式4、权限等级 三、申请应用权限1、选择申请权限的方式2、声明权限3、声明样例4、二次向用户申请授权5、具体实现示例6、效果展示 四、应用权限列表1、system_grant(系统授权&#…

【开源免费】基于SpringBoot+Vue.JS社区团购系统(JAVA毕业设计)

本文项目编号 T 024 ,文末自助获取源码 \color{red}{T024,文末自助获取源码} T024,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

亿发工单,拯救制造企业的时间:工单也能这样高效

在制造企业的日常生产中,工单管理是一项至关重要的任务。它不仅直接关系到生产效率,还影响到整个生产链的运作。然而,许多制造企业在工单处理过程中面临效率低下、沟通不畅、任务分配混乱等诸多问题,这不仅拖慢了生产进度&#xf…

2024年软件设计师中级(软考中级)详细笔记【7】面向对象技术(下)23种设计模式(分值10+)

目录 前言阅读前必看 第七章 面向对象技术(下)7.3 设计模式(固定4分)7.3.1 设计模式的要素7.3.2 创建型设计模式7.3.2.1 Abstract Factory(抽象工厂)7.3.2.2 Builder(生成器)7.3.2.3…

软件工程的学习之详细绪论

软件的定义 软件是程序和所有使程序正确运行所需要的相关文档和配置信息。 Software Program Data Document 一、软件危机: 软件开发和维护过程中遇到的一系列严重问题。 二、具体表现: 1、产品不符合用户的实际需要; 2、软件开发生产率…

安装好的 Nginx 增加 nginx-module-vts 模块

目录 1. nginx-module-vts 准备 2.查看已安装的的 nginx 编译参数 3. 重新编译 nginx 添加 nginx-module-vts 模块 4. 验证 1. nginx-module-vts 准备 # 解压 unzip nginx-module-vts-master.zip # 将解压包移动到/usr/local/目录 mv nginx-module-vts-master /usr/local/ …

基于微信小程序的购物系统【附源码、文档】

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

Java生死簿管理小系统(简单实现)

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

Oracle漏洞修复 19.3 补丁包 升级为19.22

1.场景描述 上周末2024-10-12日,服务器扫出漏洞,希望及时修复。其中,oracle的漏洞清单如下,总结了下,基本都是 Oracle Database Server 的 19.3 版本到 19.20 版本和 21.3 版本到 21.11 版本存在安全漏洞,即版本问题。如: Oracle Database Server 安全漏洞(CVE-2023-22…

OpenMediaVault安装插件以及重置web控制台密码

常用插件(可根据实际情况选择安装) openmediavault-flashmemory:加载临时文件到内存,保护硬盘;openmediavault-fail2ban :扫描日志文件并禁止显示恶意迹象的IP-太多的密码错误,寻找漏洞等&…

Java面试宝典-并发编程学习02

目录 21、并行与并发有什么区别? 22、多线程中的上下文切换指的是什么? 23、Java 中用到的线程调度算法是什么? 24、Java中线程调度器和时间分片指的是什么? 25、什么是原子操作?Java中有哪些原子类? 26、w…

(11)(2.1.5) Currawong Velocity CAN ESCs(一)

文章目录 前言 1 哪里买 2 PiccoloCAN设置 前言 Currawong 的 Velocity 系列 ESC(Velocity range of ESCs)为航空航天领域提供了高度可靠的电机控制。 Currawong 的 Velocity 系列 ESC(

[k8s理论知识]3.docker基础(二)隔离技术

容器其实是一种沙盒技术,其核心是通过约束和修改进程的动态表现,为其创建一个边界。这个边界确保了应用与应用之间不会相互干扰,同时可以方便在不同的环境中迁移,这是PaaS最理想的状态。 程序是代码的可执行镜像,通常…

【思维导图】C语言—常见概念

hello,友友们,今天我们进入一个新的专栏——思维导图! 思维导图帮助我们复习知识的同时建构出一个清晰的框架,我往后会不断更新各个专栏的思维导图,关注我,一起加油! 今天我们回顾C语言中的常见…

技术分享:A-23OH型树脂在汽车涂装废溶剂回收中的应用

在当今汽车制造业竞争激烈的环境下,提高生产效率、降低成本的同时,满足环保要求已成为各制造商追求的核心目标。水性涂料因其环保、节能等多重优势,在汽车涂装领域的应用日益广泛。然而,随之而来的喷涂废溶剂处理问题也日益凸显。…

Java 项目如何连接并使用 SFTP 服务的示例详解

文章目录 1、SFTP介绍2、pom依赖3、SFTPUtil4、测试5、测试结果 1、SFTP介绍 SFTP(Secure File Transfer Protocol)是一种安全的文件传输协议,是SSH(Secure Shell)协议的一个子协议,设计用于加密和保护文件…

测试代理IP的有效性和可用性:全面方法与技巧

使用代理IP的有效性和可用性直接关系到用户的工作效率,尤其是在进行数据抓取、网络爬虫和保护个人隐私等场景中。然而,如果代理IP的质量不佳,或者无法正常工作,就可能导致操作中断、数据丢失,甚至影响整个项目的进度。…

《OpenCV计算机视觉》——人脸检测__Haar特征、级联分类器

文章目录 Haar特征一、定义与原理二、分类三、计算方法四、应用五、优缺点 级联分类器一、定义与原理二、结构与组成三、举例说明 Haar特征 Haar特征是一种在计算机视觉和图像处理中常用的特征描述方法,特别适用于物体识别,尤其是人脸检测。以下是对Haa…

一次性入门三款分布式定时任务调度框架:Quartz、ElasticJob3.0、xxl-job

分布式定时任务调度框架(文末有源码) 前言1、Quartz1.1 数据库1.2 maven依赖1.3 代码实现1.3.1 创建一个job1.3.1 为job设置trigger 1.4 配置文件1.5 启动、测试1.1 单机1.2 集群 2、ElasticJob2.1 下载zk2.2 新建三个类型的作业2.3 配置文件2.4 启动项目…

基于Java微信小程序的水果销售系统详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…