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 或清空數組/對象

??事件監聽器未移除(閉包持有引用)??

???

移除事件,避免閉包長期持有

??定時器 / 動畫幀未清除??

???

銷毀前?clearInterval/?cancelAnimationFrame

??誤以為 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
英文地址,請注明出處:http://en.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…