Cesium1.95中如何高效管理 1500 个高频实体

一、建议:

  1. 不要频繁创建/销毁,而是复用对象;​​
  2. ​​使用 CallbackProperty更新位置而不是删了重建;​​
  3. ​​对大量 Billboard / Polyline / Label,优先使用对应的 *Collection,然后批量更新;​​
  4. ​​最后通过 removeAll()+ remove()批量移除,而不是逐个销毁;​

二、正确的性能优化手段是:

优化方向

措施

是否推荐

​高频实体管理​

使用 CallbackProperty更新位置,而不是频繁增删 Entity

✅ 强烈推荐

​批量移除​

使用 viewer.entities.removeAll()或 primitiveCollection.removeAll()(如果有的话)

✅ 推荐

​移除渲染对象​

从 viewer.scene.primitives中移除不用的 Primitive / Collection

✅ 必须

​避免内存泄漏​

移除后解除 JS 引用(如设为 null),帮助 GC 回收

✅ 推荐

三、为什么销毁后内存仍泄漏?——最常见原因排行榜

原因

是否常见

解决方案

​JavaScript 对象仍被变量 / 数组 / 缓存引用​

⭐⭐⭐⭐⭐

手动置 null 或清空数组/对象

​事件监听器未移除(闭包持有引用)​

⭐⭐⭐

移除事件,避免闭包长期持有

​定时器 / 动画帧未清除​

⭐⭐⭐

销毁前 clearIntervalcancelAnimationFrame

​误以为 Cesium 有 destroy()方法,尝试调用不存在的 API​

⭐⭐

只需 remove()和 removeAll()

​第三方库 / 自己的代码缓存了 Entity / Primitive 对象​

⭐⭐⭐⭐

检查缓存逻辑并清理

​GC 延迟,对象尚未被回收(假性泄漏)​

⭐⭐

观察一段时间,或强制触发 GC(Chrome 可手动触发)

四、你应该怎么做?—— 排查与优化 checklist

步骤

操作

是否完成

1

调用 viewer.entities.removeAll()等标准 API

✅ 你已完成

2

调用 primitiveCollection.removeAll()viewer.scene.primitives.remove(...)

✅ 你已完成

3

​将相关对象引用设为 null(如 polylineCollection = null)​

⚠️ 请检查

4

​检查是否有全局变量 / 数组 / 缓存仍然持有这些对象​

⚠️ 重点排查

5

​移除所有事件监听器(如 entity.click)​

⚠️ 检查绑定逻辑

6

​清除定时器 / requestAnimationFrame​

⚠️ 检查循环逻辑

7

​用 Chrome DevTools Memory 工具做 Heap Snapshot 对比分析​

⚠️ 强烈推荐

五、如何进一步诊断内存泄漏?

✅ 方法 1:Chrome DevTools → Memory 工具

推荐操作:

  1. ​​打开 Chrome 开发者工具 → Memory 标签​​
  2. 使用 ​​Heap Snapshot​​ 功能:
  3. 在销毁前拍一个快照(Snapshot 1)
  4. 执行你的销毁代码(removeAll()等)
  5. 等待几秒后,再拍一个快照(Snapshot 2)
  6. 使用 ​​Comparison(对比)​​ 查看:
  7. 哪些 Cesium.Entity/ PolylineCollection等对象数量没有下降
  8. 谁仍然持有这些对象的引用(Retainers)
  9. 使用 ​​Allocation instrumentation on timeline​​:
  10. 可以观察内存分配随时间的变化,找到持续增长的对象类型。

步骤

操作

目的

1️⃣

打开 Chrome DevTools → Memory

进入内存分析工具

2️⃣

选择 Heap Snapshot → 点击 Take snapshot

拍摄销毁前的内存状态(如:创建了 1500 个 Entity)

3️⃣

执行你的销毁代码(如 viewer.entities.removeAll()等)

移除 Cesium 对象

4️⃣

再次进入 Memory → Heap Snapshot → Take snapshot

拍摄销毁后的内存状态

5️⃣

在 Heap Snapshot 面板,选择 ​​Comparison​​ 视图

切换为对比模式

6️⃣

在下拉菜单中:
- ​​Base snapshot​​ 选:销毁前快照
- ​​Compare to snapshot​​ 选:销毁后快照

查看哪些对象仍然存在(疑似泄漏)

7️⃣

查看 Objects 数量异常的对象(比如 Cesium.Entity 仍有 1000 个)

定位可能泄漏的类型

8️⃣

点击具体对象/类型 → 查看 ​​Retainers​​ 引用链

找出谁(变量/闭包/缓存)仍然引用着它

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

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

相关文章

全面了解机器语言之kmeans

深入理解 KMeans 聚类算法:原理、实现与应用在机器学习领域,聚类算法作为无监督学习的核心技术之一,一直以来都是数据挖掘和模式识别的重要工具。其中,KMeans 算法以其简洁的原理、高效的计算性能和广泛的适用性,成为最…

纳米陶瓷与光子集成:猎板PCB定义下一代VR硬件的技术蓝图

虚拟现实(VR)设备正从“视觉沉浸”向“多感官无感交互”演进,其底层PCB技术面临带宽、算力密度与动态可靠性的三重挑战。作为国内高端PCB技术的引领者,​​猎板PCB​​以材料革新、光电子融合与智能响应为核心,构建了适…

Linux ssh-keygen系列命令与ssh命令的使用

关联文章 Linux ssh 免密登录配置👍对日开发 TeraTerm 批量向各台服务器传输文件SSH 教程👍👍👍👍👍👍 目录一. ssh-keygen相关命令1.1 简介1.2 生成密钥1.3 ssh-copy-id 上传公钥到指定的服务…

从C++0基础到C++入门 (第二十五节:指针【所占内存空间】)

目录 一. 指针所占内存空间 1.1 验证指针大小的代码示例 1.2 不同系统架构下的差异 1.3 指针大小与类型无关 1.4 空指针的大小 1.5 多级指针的大小 1.6 实际应用中的注意事项 一. 指针所占内存空间 指针在内存中占用的空间大小取决于系统架构和编译环境。 32位系统中指…

Windows选择文件自动删除及输入框自动打字的解决办法

觉得有帮助麻烦您动动发财的小手点赞、收藏、加关注,感谢! 运行环境:windows10 现象:鼠标点击任何文件,上下键选择任何文件都会自动放入回收站并弹警告框,鼠标放入输入框会自动打一串字符,删除…

大模型 MCP服务案例详细讲解

大模型与 MCP(Model Context Protocol)服务器的交互是一个双向、异步、流式的过程,涉及协议解析、函数调用、实时数据交换等关键环节。下面我将详细解释整个交互流程,结合具体示例和时序图说明。 🔄 核心交互流程图 #mermaid-svg-Adxo4FoP4oRzAJdV {font-family:"tr…

MVCC和日志

MVCC是一种并发控制的方法,在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存主要是为了提高数据库并发性能,更好的处理读写冲突,做到即使有读写冲突时,也能做到不加锁,非阻…

Redis源码安装 Failed to configure LOCALE for invalid locale name 报错解决

源码安装之后 报错 Failed to configure LOCALE for invalid locale name原因是redis 8.0 需要配置字符集 只需要在环境变量中添加 LANGen_US.utf8 即可, 在配置之前先查看当前系统中存在哪些字符集 locale -a然后在 /etc/profile 环境变量中添加配置 LANGen_US.ut…

跑酷小游戏2.0

emm&#xff0c;下面是1.0版本的&#xff0c;我问了下AI&#xff0c;出了第四关&#xff0c;按步骤更新吧。其实是我也搞不懂AI在说啥//跑酷游戏C版 #include<bits/stdc.h> #include<windows.h> #include<stdio.h> #include<conio.h> #include<tim…

相比于传统的全波分析,特征模分析具有哪些优点

相比传统的全波分析&#xff08;Full-Wave Analysis&#xff0c;直接求解电场/电流分布&#xff09;&#xff0c;特征模分析&#xff08;Characteristic Mode Analysis&#xff0c;CMA&#xff09;的优点主要体现在物理可解释性、设计指导性和计算效率三个方面。1. 物理机理更清…

UE材质World Position 和 Object Position

Object Position 是 物体原点在世界坐标系下的位置 World Position 是 物体上的这个点 在世界坐标系下的位置 Actor Position 是 物体轴点位置 WorldPosition - ObjectPosition 是一个从物体原点&#xff08;pivot&#xff09;指向物体上该点的向量&#xff08;方向&#x…

github上传文件

git remote add origin https://github.com/Ineedstrong/socket-practice.git如果不行的情况下git remote set-url origin gitgithub.com:Ineedstrong/socket-practice.git就以这种方式3. 使用 SSH 替代 HTTPS&#xff08;推荐&#xff09;绕过 HTTPS 的 TLS 问题&#xff1a;生…

【STM32U385RG 测评】基于VSCode的STM32开发环境搭建

【STM32U385RG 测评】搭建基于VSCode的STM32开发环境 文章目录【STM32U385RG 测评】搭建基于VSCode的STM32开发环境一、安装软件1.1 安装VSCode1.2 安装STM32CubeMX1.3 安装STM32CubeCLT1.4 安装ST-MCU-FINDER-PC二、安装插件2.1 安装 STM32Cube for VSCode插件三、创建项目3.1…

设计模式(二)——策略模式

一、基本概念 既然你已经接触到了设计模式&#xff0c;那你大概率你写过类似这样的代码&#xff1a;根据不同的选择条件&#xff08;如排序、搜索或路由&#xff09;执行不同的代码逻辑。通常的解决方案是使用if-else或switch语句&#xff0c;但这些条件判断有一个最大的问题是…

MySQL基础知识总结

一、MySQL简述 数据库 是一个有组织的集合&#xff0c;用于存储和管理数据的系统。它是一个软件系统&#xff0c;被设计用来存储、检索和管理数据&#xff0c;并提供数据的快速访问和处理。数据库可以被看作是一种特殊的文件系统&#xff0c;但与传统的文件系统不同的是&#…

数据仓库命名规范

1. 概述 数据模型是数据管理的分析工具和交流的有力手段&#xff1b;同时&#xff0c;还能够很好地保证数据的一致性&#xff0c;是实现商务智能&#xff08;Business Intelligence&#xff09;的重要基础。因此建立、管理一个企业级的数据模型&#xff0c;应该遵循标准的命名…

FlinkSQL Joins全解析

1. Lookup Join用途&#xff1a;用于流表与外部维表&#xff08;静态或缓慢变化表&#xff09;的关联&#xff08;如 MySQL、HBase 等&#xff09;。特点&#xff1a;通过 实时查询外部存储 获取维度数据。仅支持 处理时间&#xff08;Processing Time&#xff09;语义&#xf…

【FileZilla】基于 FTP 的 Windows 和 Linux 文件传输

在嵌入式开发过程中我们经常需要在 Windows 和 Linux 下进行文件传输&#xff0c;本文就介绍一种通过 FTP 实现 Windows 和 Linux 文件传输的方法。 Windows 为物理主机&#xff0c;Linux 是在 Vmware 虚拟机中安装运行的 Ubuntu&#xff0c;版本为 18.04。 Ubuntu 安装 FTP …

【GPT入门】第42课 ollama安装与运行llama3模型

【GPT入门】第42课 ollama安装与运行llama3模型1. 安装ollama2.运行模型3.测试模型3.1 直接在命令行交互3.2 openai接口1. 安装ollama https://ollama.com/ 选download, 选linux 执行安装命令&#xff1a; curl -fsSL https://ollama.com/install.sh | sh2.运行模型 启动服…

Lua语言元表、协同程序

元表元表的定义允许我们改变table的行为。setmetatable(普通表&#xff0c;元表)-- 元表a {"a","b","c"} -- 普通表 b {} --元表c setmetatable(a,b)print("------------------------")f {}print("f:",f)d setmetatabl…