From dd82a80f6e54eabbe06dea3e0547d091b590e087 Mon Sep 17 00:00:00 2001 From: Adam Beili Date: Tue, 7 Oct 2025 12:45:34 +0300 Subject: [PATCH 1/5] 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/5] 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/5] 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/5] 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 c87acd65639de3a07bc266bb2a402f27acf9bf80 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 28 Nov 2025 00:38:42 +0200 Subject: [PATCH 5/5] Rename to shallowClone --- .../engine/Source/Scene/Cesium3DTileset.js | 4 ++-- .../Source/Scene/Cesium3DTilesetStatistics.js | 22 +++++++++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/packages/engine/Source/Scene/Cesium3DTileset.js b/packages/engine/Source/Scene/Cesium3DTileset.js index 4a72983b483c..fd2b6483ed47 100644 --- a/packages/engine/Source/Scene/Cesium3DTileset.js +++ b/packages/engine/Source/Scene/Cesium3DTileset.js @@ -3285,7 +3285,7 @@ function raiseLoadProgressEvent(tileset, frameState) { const lastNumberOfPendingRequest = statisticsLast.numberOfPendingRequests; const lastNumberOfTilesProcessing = statisticsLast.numberOfTilesProcessing; - Cesium3DTilesetStatistics.clone(statistics, statisticsLast); + Cesium3DTilesetStatistics.shallowClone(statistics, statisticsLast); const progressChanged = numberOfPendingRequests !== lastNumberOfPendingRequest || @@ -3408,7 +3408,7 @@ function update(tileset, frameState, passStatistics, passOptions) { updateTiles(tileset, frameState, passOptions); // Update pass statistics - Cesium3DTilesetStatistics.clone(statistics, passStatistics); + Cesium3DTilesetStatistics.shallowClone(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..5b38e92a7361 100644 --- a/packages/engine/Source/Scene/Cesium3DTilesetStatistics.js +++ b/packages/engine/Source/Scene/Cesium3DTilesetStatistics.js @@ -1,3 +1,4 @@ +import Check from "../Core/Check.js"; import defined from "../Core/defined.js"; import Model3DTileContent from "./Model/Model3DTileContent.js"; @@ -59,6 +60,10 @@ Cesium3DTilesetStatistics.prototype.clear = function () { Cesium3DTilesetStatistics.prototype.incrementSelectionCounts = function ( content, ) { + Check.defined( + "texturesReferenceCounterById", + this.texturesReferenceCounterById, + ); this.numberOfFeaturesSelected += content.featuresLength; this.numberOfPointsSelected += content.pointsLength; this.numberOfTrianglesSelected += content.trianglesLength; @@ -84,6 +89,10 @@ Cesium3DTilesetStatistics.prototype.incrementSelectionCounts = function ( * @param {Cesium3DTileContent} content */ Cesium3DTilesetStatistics.prototype.incrementLoadCounts = function (content) { + Check.defined( + "texturesReferenceCounterById", + this.texturesReferenceCounterById, + ); this.numberOfFeaturesLoaded += content.featuresLength; this.numberOfPointsLoaded += content.pointsLength; this.geometryByteLength += content.geometryByteLength; @@ -130,6 +139,10 @@ Cesium3DTilesetStatistics.prototype.incrementLoadCounts = function (content) { * @param {Cesium3DTileContent} content */ Cesium3DTilesetStatistics.prototype.decrementLoadCounts = function (content) { + Check.defined( + "texturesReferenceCounterById", + this.texturesReferenceCounterById, + ); this.numberOfFeaturesLoaded -= content.featuresLength; this.numberOfPointsLoaded -= content.pointsLength; this.geometryByteLength -= content.geometryByteLength; @@ -166,7 +179,12 @@ Cesium3DTilesetStatistics.prototype.decrementLoadCounts = function (content) { } }; -Cesium3DTilesetStatistics.clone = function (statistics, result) { +/** + * Shallow copies the given statistics object into the resulting statistics object. + * + * The result cannot be used to increment/decrement load counts. + */ +Cesium3DTilesetStatistics.shallowClone = function (statistics, result) { result.selected = statistics.selected; result.visited = statistics.visited; result.numberOfCommands = statistics.numberOfCommands; @@ -187,7 +205,7 @@ Cesium3DTilesetStatistics.clone = function (statistics, result) { statistics.numberOfTilesCulledWithChildrenUnion; result.geometryByteLength = statistics.geometryByteLength; result.texturesByteLength = statistics.texturesByteLength; - result.texturesReferenceCounterById = statistics.texturesReferenceCounterById; result.batchTableByteLength = statistics.batchTableByteLength; + result.texturesReferenceCounterById = undefined; }; export default Cesium3DTilesetStatistics;