Cesium 影像加载的TileReplacementQueue技术

embedded/2025/2/16 3:23:27/

本文以分析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.ppmy.cn/embedded/129125.html

相关文章

FFmpeg的简单使用【Windows】--- 视频混剪+添加背景音乐

一、功能描述 点击背景音乐区域的【选择文件】按钮,选择音频文件并将其上传到服务器,上传成功后会将其存储的位置路径返回。 然后,点击要处理视频区域的【选择文件】按钮选择要进行混剪的视频素材(1-10个)。 以上两…

AWS Aurora 实例更换实战:最小化业务影响的升级策略

在本文中,我们将详细介绍如何在生产环境中安全地更换 AWS Aurora 实例,包括主写实例和只读实例的更换过程。我们的目标是将影响降到最低,同时确保系统的稳定性和性能。 背景 随着业务的增长,我们需要升级现有的 Aurora 实例以提供更好的性能和更大的容量。本次更换涉及主…

比较相同机器上 redis和mysql分别单独承载的 最大连接数量

在相同的机器上,Redis 和 MySQL 的最大连接数量会受到硬件配置(如 CPU、内存、网络等)、配置参数和应用场景的影响。以下是对 Redis 和 MySQL 在单机环境下最大连接数的比较: Redis 最大连接数量 默认配置: Redis 默…

排序算法 —— 直接插入排序

目录 1.直接插入排序的思想 2.直接插入排序的实现 实现分析 实现代码 3.直接插入排序的分析 时间复杂度分析 空间复杂度分析 稳定性 1.直接插入排序的思想 直接插入排序的思想就是把待排序的元素按其关键码值的大小依次插入到一个已经排好序的有序序列中&#xff0c…

Android摄像头Camera2和Camera1的一些总结

Android 系统对摄像头的同时使用有限制,不能同时使用摄像头进行预览或者录制音视频。 例如:界面上有两个SurfaceView, 这两个SurfaceView不能同时预览或者录制音视频,只能有一个正常工作(一个SurfaceView预览前置摄像头&#xff…

在Openshift(K8S)上通过EMQX Operator部署Emqx集群

EMQX Operator 简介 EMQX Broker/Enterprise 是一个云原生的 MQTT 消息中间件。 我们提供了 EMQX Kubernetes Operator 来帮助您在 Kubernetes 的环境上快速创建和管理 EMQX Broker/Enterprise 集群。 它可以大大简化部署和管理 EMQX 集群的流程,对于管理和配置的知…

智能电池与ROS通信让机器人获取电池电流电压电量信息

anaxinbattery-ros git源码地址anaxinbattery-ros: 实现智能电池数据包读取解析并发布sensor_msgs::BatteryState到ROS消息系统 介绍 实现智能电池数据包读取解析并发布sensor_msgs::BatteryState到ROS消息系统 软件架构 支持ROS1,包括kinetic、melodic、noetic 安装教程…

SQL Server 2019数据库“正常,已自动关闭”

现象: SQL Server 2019中,某个数据库在SQL Server Management Studio(SSMS)中的状态显示为“正常,已自动关闭”。 解释: 如此显示,是由于该数据库的AUTO_ CLOSE选项被设为True。 在微软的官…