From dd82a80f6e54eabbe06dea3e0547d091b590e087 Mon Sep 17 00:00:00 2001 From: Adam Beili Date: Tue, 7 Oct 2025 12:45:34 +0300 Subject: [PATCH 1/6] Remove Cesium3DTilesetStatistics.textureReferenceCounterById destructure --- .../Source/Scene/Cesium3DTilesetStatistics.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/engine/Source/Scene/Cesium3DTilesetStatistics.js b/packages/engine/Source/Scene/Cesium3DTilesetStatistics.js index 17b094f33ad0..c70b1c40acac 100644 --- a/packages/engine/Source/Scene/Cesium3DTilesetStatistics.js +++ b/packages/engine/Source/Scene/Cesium3DTilesetStatistics.js @@ -30,7 +30,7 @@ function Cesium3DTilesetStatistics() { // Memory statistics this.geometryByteLength = 0; this.texturesByteLength = 0; - this.texturesReferenceCounterById = {}; + this.texturesReferenceCounterById = new Map(); this.batchTableByteLength = 0; // batch textures and any binary metadata properties not otherwise accounted for } @@ -100,12 +100,12 @@ Cesium3DTilesetStatistics.prototype.incrementLoadCounts = function (content) { const textureIds = content.getTextureIds(); for (const textureId of textureIds) { const referenceCounter = - this.texturesReferenceCounterById[textureId] ?? 0; + this.texturesReferenceCounterById.get(textureId) ?? 0; if (referenceCounter === 0) { const textureByteLength = content.getTextureByteLengthById(textureId); this.texturesByteLength += textureByteLength; } - this.texturesReferenceCounterById[textureId] = referenceCounter + 1; + this.texturesReferenceCounterById.set(textureId, referenceCounter + 1); } } @@ -146,13 +146,13 @@ Cesium3DTilesetStatistics.prototype.decrementLoadCounts = function (content) { // total textures byte length const textureIds = content.getTextureIds(); for (const textureId of textureIds) { - const referenceCounter = this.texturesReferenceCounterById[textureId]; + const referenceCounter = this.texturesReferenceCounterById.get(textureId); if (referenceCounter === 1) { - delete this.texturesReferenceCounterById[textureId]; + this.texturesReferenceCounterById.delete(textureId); const textureByteLength = content.getTextureByteLengthById(textureId); this.texturesByteLength -= textureByteLength; } else { - this.texturesReferenceCounterById[textureId] = referenceCounter - 1; + this.texturesReferenceCounterById.set(textureId, referenceCounter - 1); } } } @@ -187,9 +187,7 @@ Cesium3DTilesetStatistics.clone = function (statistics, result) { statistics.numberOfTilesCulledWithChildrenUnion; result.geometryByteLength = statistics.geometryByteLength; result.texturesByteLength = statistics.texturesByteLength; - result.texturesReferenceCounterById = { - ...statistics.texturesReferenceCounterById, - }; + result.texturesReferenceCounterById = statistics.texturesReferenceCounterById; result.batchTableByteLength = statistics.batchTableByteLength; }; export default Cesium3DTilesetStatistics; From 1f2458c02971acd52b003a945e61b69ea66d3565 Mon Sep 17 00:00:00 2001 From: Adam Beili Date: Fri, 10 Oct 2025 23:14:22 +0300 Subject: [PATCH 2/6] tileset traversal visit fix --- packages/engine/Source/Scene/Cesium3DTilesetTraversal.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js b/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js index fd13b76d9d4a..8b2a70b0b752 100644 --- a/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js +++ b/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js @@ -188,6 +188,10 @@ function isOnScreenLongEnough(tile, frameState) { * @param {FrameState} frameState */ Cesium3DTilesetTraversal.updateTile = function (tile, frameState) { + if (tile._visitedFrame === frameState.frameNumber) { + return; + } + Cesium3DTilesetTraversal.visitTile(tile, frameState); updateTileVisibility(tile, frameState); tile.updateExpiration(); From 729a10b1e14b90bfb90ed2f51fd6a37204bc5de7 Mon Sep 17 00:00:00 2001 From: Adam Beili Date: Sat, 11 Oct 2025 00:04:55 +0300 Subject: [PATCH 3/6] Revert "tileset traversal visit fix" This reverts commit 1f2458c02971acd52b003a945e61b69ea66d3565. --- packages/engine/Source/Scene/Cesium3DTilesetTraversal.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js b/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js index 8b2a70b0b752..fd13b76d9d4a 100644 --- a/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js +++ b/packages/engine/Source/Scene/Cesium3DTilesetTraversal.js @@ -188,10 +188,6 @@ function isOnScreenLongEnough(tile, frameState) { * @param {FrameState} frameState */ Cesium3DTilesetTraversal.updateTile = function (tile, frameState) { - if (tile._visitedFrame === frameState.frameNumber) { - return; - } - Cesium3DTilesetTraversal.visitTile(tile, frameState); updateTileVisibility(tile, frameState); tile.updateExpiration(); From 5150e74d3e3143e9aea95f4572bfdd854021e697 Mon Sep 17 00:00:00 2001 From: Adam Beili Date: Sat, 11 Oct 2025 00:06:46 +0300 Subject: [PATCH 4/6] Changelog --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 23f5e58cbf33..c48c166f03b8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,6 +15,7 @@ - Fix issues with label background when updating properties while `label.show` is `false`. [#12138](https://github.com/CesiumGS/cesium/issues/12138) - Improved performance of `scene.drillPick`. [#12916](https://github.com/CesiumGS/cesium/pull/12916) - Improved performance when removing primitives. [#3018](https://github.com/CesiumGS/cesium/pull/3018) +- Improved rendering performance when a 3D tileset is loaded [#12974](https://github.com/CesiumGS/cesium/pull/12974) ## 1.134 - 2025-10-01 From 2f5822b722777e2a9629fb3fe4dcf6d0b10a9267 Mon Sep 17 00:00:00 2001 From: Adam Beili Date: Thu, 16 Oct 2025 16:27:38 +0300 Subject: [PATCH 5/6] Snapshot example --- .../engine/Source/Scene/Cesium3DTileset.js | 12 ++++--- .../Source/Scene/Cesium3DTilesetStatistics.js | 34 ++++++++++++++++--- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/packages/engine/Source/Scene/Cesium3DTileset.js b/packages/engine/Source/Scene/Cesium3DTileset.js index cbc8a458ec8f..4cd03b94afef 100644 --- a/packages/engine/Source/Scene/Cesium3DTileset.js +++ b/packages/engine/Source/Scene/Cesium3DTileset.js @@ -269,11 +269,13 @@ function Cesium3DTileset(options) { this._addHeightCallbacks = []; this._statistics = new Cesium3DTilesetStatistics(); - this._statisticsLast = new Cesium3DTilesetStatistics(); + this._statisticsLast = Cesium3DTilesetStatistics.snapshot(this._statistics); this._statisticsPerPass = new Array(Cesium3DTilePass.NUMBER_OF_PASSES); for (let i = 0; i < Cesium3DTilePass.NUMBER_OF_PASSES; ++i) { - this._statisticsPerPass[i] = new Cesium3DTilesetStatistics(); + this._statisticsPerPass[i] = Cesium3DTilesetStatistics.snapshot( + this._statistics, + ); } this._requestedTilesInFlight = []; @@ -3285,7 +3287,7 @@ function raiseLoadProgressEvent(tileset, frameState) { const lastNumberOfPendingRequest = statisticsLast.numberOfPendingRequests; const lastNumberOfTilesProcessing = statisticsLast.numberOfTilesProcessing; - Cesium3DTilesetStatistics.clone(statistics, statisticsLast); + Cesium3DTilesetStatistics.snapshot(statistics, this._statisticsLast); const progressChanged = numberOfPendingRequests !== lastNumberOfPendingRequest || @@ -3371,7 +3373,7 @@ function detectModelMatrixChanged(tileset, frameState) { * @private * @param {Cesium3DTileset} tileset * @param {FrameState} frameState - * @param {Cesium3DTilesetStatistics} passStatistics + * @param {Cesium3DTilesetStatisticsSnapshot} passStatistics * @param {object} passOptions * @returns {boolean} */ @@ -3408,7 +3410,7 @@ function update(tileset, frameState, passStatistics, passOptions) { updateTiles(tileset, frameState, passOptions); // Update pass statistics - Cesium3DTilesetStatistics.clone(statistics, passStatistics); + Cesium3DTilesetStatistics.snapshot(statistics, passStatistics); if (passOptions.isRender) { const credits = tileset._credits; diff --git a/packages/engine/Source/Scene/Cesium3DTilesetStatistics.js b/packages/engine/Source/Scene/Cesium3DTilesetStatistics.js index c70b1c40acac..1960662cc3aa 100644 --- a/packages/engine/Source/Scene/Cesium3DTilesetStatistics.js +++ b/packages/engine/Source/Scene/Cesium3DTilesetStatistics.js @@ -4,7 +4,7 @@ import Model3DTileContent from "./Model/Model3DTileContent.js"; /** * @private */ -function Cesium3DTilesetStatistics() { +function Cesium3DTilesetStatisticsSnapshot() { // Rendering statistics this.selected = 0; this.visited = 0; @@ -30,10 +30,17 @@ function Cesium3DTilesetStatistics() { // Memory statistics this.geometryByteLength = 0; this.texturesByteLength = 0; - this.texturesReferenceCounterById = new Map(); this.batchTableByteLength = 0; // batch textures and any binary metadata properties not otherwise accounted for } +/** + * @private + */ +function Cesium3DTilesetStatistics() { + Cesium3DTilesetStatisticsSnapshot.call(this); + this.texturesReferenceCounterById = new Map(); +} + Cesium3DTilesetStatistics.prototype.clear = function () { this.selected = 0; this.visited = 0; @@ -166,7 +173,15 @@ Cesium3DTilesetStatistics.prototype.decrementLoadCounts = function (content) { } }; -Cesium3DTilesetStatistics.clone = function (statistics, result) { +/** + * @param {Cesium3DTilesetStatistics} statistics + * @param {Cesium3DTilesetStatisticsSnapshot} result + * @returns {Cesium3DTilesetStatisticsSnapshot} + */ +Cesium3DTilesetStatistics.snapshot = function ( + statistics, + result = new Cesium3DTilesetStatisticsSnapshot(), +) { result.selected = statistics.selected; result.visited = statistics.visited; result.numberOfCommands = statistics.numberOfCommands; @@ -187,7 +202,18 @@ Cesium3DTilesetStatistics.clone = function (statistics, result) { statistics.numberOfTilesCulledWithChildrenUnion; result.geometryByteLength = statistics.geometryByteLength; result.texturesByteLength = statistics.texturesByteLength; - result.texturesReferenceCounterById = statistics.texturesReferenceCounterById; result.batchTableByteLength = statistics.batchTableByteLength; + + return result; +}; + +Cesium3DTilesetStatistics.clone = function ( + statistics, + result = new Cesium3DTilesetStatistics(), +) { + Cesium3DTilesetStatistics.snapshot(statistics, result); + result.texturesReferenceCounterById = new Map( + statistics.texturesReferenceCounterById, + ); }; export default Cesium3DTilesetStatistics; From 617a9e5be22b82000832da966afddde9bf04f271 Mon Sep 17 00:00:00 2001 From: Adam Beili Date: Fri, 17 Oct 2025 00:16:31 +0300 Subject: [PATCH 6/6] Fix undefined statisticsLast --- packages/engine/Source/Scene/Cesium3DTileset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/engine/Source/Scene/Cesium3DTileset.js b/packages/engine/Source/Scene/Cesium3DTileset.js index 4cd03b94afef..32a72b19b892 100644 --- a/packages/engine/Source/Scene/Cesium3DTileset.js +++ b/packages/engine/Source/Scene/Cesium3DTileset.js @@ -3287,7 +3287,7 @@ function raiseLoadProgressEvent(tileset, frameState) { const lastNumberOfPendingRequest = statisticsLast.numberOfPendingRequests; const lastNumberOfTilesProcessing = statisticsLast.numberOfTilesProcessing; - Cesium3DTilesetStatistics.snapshot(statistics, this._statisticsLast); + Cesium3DTilesetStatistics.snapshot(statistics, statisticsLast); const progressChanged = numberOfPendingRequests !== lastNumberOfPendingRequest ||