当前位置: 首页 > ds >正文

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

​尝试调用不存在的 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.xdnf.cn/news/17677.html

相关文章:

  • 赋值运算符指南
  • 代码可读性与维护性的实践与原则
  • word中,添加新的参考文献后,其他参考文献的交叉引用不能及时更新的解决办法
  • 《Webpack与Vite热模块替换机制深度剖析与策略抉择》
  • 二维前缀和问题
  • 如何在 Ubuntu 24.04 LTS Linux 上安装 MySQL 服务器
  • 电脑本地摄像头做成rtsp流调用测试windows系统中
  • 【大智慧数据】心智开花的时候
  • AI测试助手如何让Bug无处可藏
  • Dify 从入门到精通(第 26/100 篇):Dify 的知识图谱集成
  • 2025最新免费的大模型和免费的大模型API有哪些?(202508更新)
  • 2025年6月电子学会全国青少年软件编程等级考试(Python二级)真题及答案
  • 【Linux指南】Vim的全面解析与深度应用
  • C语言第八章指针四
  • 【接口自动化】初识pytest,一文讲解pytest的安装,识别规则以及配置文件的使用
  • Jotai:React轻量级状态管理新选择
  • Code Exercising Day 10 of “Code Ideas Record“:StackQueue part02
  • SQL三剑客:DELETE、TRUNCATE、DROP全解析
  • CentOS7.9 离线安装mysql数据库
  • CPP继承
  • Windows执行kubectl提示拒绝访问【Windows安装k8s】
  • `sk_buff` 结构体详解(包含全生命周期解析)
  • 数学建模:控制预测类问题
  • 全面了解机器语言之kmeans
  • 010601抓包工具及证书安装-基础入门-网络安全
  • 【Matplotlib】中文显示问题
  • 企业级WEB应用服务器TOMCAT — WEB技术详细部署
  • 正点原子esp32s3探测土壤湿度
  • openpnp - 顶部相机如果超过6.5米影响通讯质量,可以加USB3.0信号放大器延长线
  • Effective C++ 条款34:区分接口继承和实现继承