@cesium/engine
Version:
CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.
196 lines (185 loc) • 7.59 kB
JavaScript
import defined from "../Core/defined.js";
import Model3DTileContent from "./Model/Model3DTileContent.js";
/**
* @private
*/
function Cesium3DTilesetStatistics() {
// Rendering statistics
this.selected = 0;
this.visited = 0;
// Loading statistics
this.numberOfCommands = 0;
this.numberOfAttemptedRequests = 0;
this.numberOfPendingRequests = 0;
this.numberOfTilesProcessing = 0;
this.numberOfTilesWithContentReady = 0; // Number of tiles with content loaded, does not include empty tiles
this.numberOfTilesTotal = 0; // Number of tiles in tileset JSON (and other tileset JSON files as they are loaded)
this.numberOfLoadedTilesTotal = 0; // Running total of loaded tiles for the lifetime of the session
// Features statistics
this.numberOfFeaturesSelected = 0; // Number of features rendered
this.numberOfFeaturesLoaded = 0; // Number of features in memory
this.numberOfPointsSelected = 0;
this.numberOfPointsLoaded = 0;
this.numberOfTrianglesSelected = 0;
// Styling statistics
this.numberOfTilesStyled = 0;
this.numberOfFeaturesStyled = 0;
// Optimization statistics
this.numberOfTilesCulledWithChildrenUnion = 0;
// Memory statistics
this.geometryByteLength = 0;
this.texturesByteLength = 0;
this.texturesReferenceCounterById = {};
this.batchTableByteLength = 0; // batch textures and any binary metadata properties not otherwise accounted for
}
Cesium3DTilesetStatistics.prototype.clear = function () {
this.selected = 0;
this.visited = 0;
this.numberOfCommands = 0;
this.numberOfAttemptedRequests = 0;
this.numberOfFeaturesSelected = 0;
this.numberOfPointsSelected = 0;
this.numberOfTrianglesSelected = 0;
this.numberOfTilesStyled = 0;
this.numberOfFeaturesStyled = 0;
this.numberOfTilesCulledWithChildrenUnion = 0;
};
/**
* Increment the counters for the points, triangles, and features
* that are currently selected for rendering.
*
* This will be called recursively for the given content and
* all its inner contents
*
* @param {Cesium3DTileContent} content
*/
Cesium3DTilesetStatistics.prototype.incrementSelectionCounts = function (
content,
) {
this.numberOfFeaturesSelected += content.featuresLength;
this.numberOfPointsSelected += content.pointsLength;
this.numberOfTrianglesSelected += content.trianglesLength;
// Recursive calls on all inner contents
const contents = content.innerContents;
if (defined(contents)) {
const length = contents.length;
for (let i = 0; i < length; ++i) {
this.incrementSelectionCounts(contents[i]);
}
}
};
/**
* Increment the counters for the number of features and points that
* are currently loaded, and the lengths (size in bytes) of the
* occupied memory.
*
* This will be called recursively for the given content and
* all its inner contents
*
* @param {Cesium3DTileContent} content
*/
Cesium3DTilesetStatistics.prototype.incrementLoadCounts = function (content) {
this.numberOfFeaturesLoaded += content.featuresLength;
this.numberOfPointsLoaded += content.pointsLength;
this.geometryByteLength += content.geometryByteLength;
this.batchTableByteLength += content.batchTableByteLength;
// When the content is not a `Model3DTileContent`, then its
// textures byte length is added directly
if (!(content instanceof Model3DTileContent)) {
this.texturesByteLength += content.texturesByteLength;
} else {
// When the content is a `Model3DTileContent`, then increment the
// reference counter for all its textures. The byte length of any
// newly tracked texture to the total textures byte length
const textureIds = content.getTextureIds();
for (const textureId of textureIds) {
const referenceCounter =
this.texturesReferenceCounterById[textureId] ?? 0;
if (referenceCounter === 0) {
const textureByteLength = content.getTextureByteLengthById(textureId);
this.texturesByteLength += textureByteLength;
}
this.texturesReferenceCounterById[textureId] = referenceCounter + 1;
}
}
// Recursive calls on all inner contents
const contents = content.innerContents;
if (defined(contents)) {
const length = contents.length;
for (let i = 0; i < length; ++i) {
this.incrementLoadCounts(contents[i]);
}
}
};
/**
* Decrement the counters for the number of features and points that
* are currently loaded, and the lengths (size in bytes) of the
* occupied memory.
*
* This will be called recursively for the given content and
* all its inner contents
*
* @param {Cesium3DTileContent} content
*/
Cesium3DTilesetStatistics.prototype.decrementLoadCounts = function (content) {
this.numberOfFeaturesLoaded -= content.featuresLength;
this.numberOfPointsLoaded -= content.pointsLength;
this.geometryByteLength -= content.geometryByteLength;
this.batchTableByteLength -= content.batchTableByteLength;
// When the content is not a `Model3DTileContent`, then its
// textures byte length is subtracted directly
if (!(content instanceof Model3DTileContent)) {
this.texturesByteLength -= content.texturesByteLength;
} else {
// When the content is a `Model3DTileContent`, then decrement the
// reference counter for all its textures. The byte length of any
// texture that is no longer references is subtracted from the
// total textures byte length
const textureIds = content.getTextureIds();
for (const textureId of textureIds) {
const referenceCounter = this.texturesReferenceCounterById[textureId];
if (referenceCounter === 1) {
delete this.texturesReferenceCounterById[textureId];
const textureByteLength = content.getTextureByteLengthById(textureId);
this.texturesByteLength -= textureByteLength;
} else {
this.texturesReferenceCounterById[textureId] = referenceCounter - 1;
}
}
}
// Recursive calls on all inner contents
const contents = content.innerContents;
if (defined(contents)) {
const length = contents.length;
for (let i = 0; i < length; ++i) {
this.decrementLoadCounts(contents[i]);
}
}
};
Cesium3DTilesetStatistics.clone = function (statistics, result) {
result.selected = statistics.selected;
result.visited = statistics.visited;
result.numberOfCommands = statistics.numberOfCommands;
result.numberOfAttemptedRequests = statistics.numberOfAttemptedRequests;
result.numberOfPendingRequests = statistics.numberOfPendingRequests;
result.numberOfTilesProcessing = statistics.numberOfTilesProcessing;
result.numberOfTilesWithContentReady =
statistics.numberOfTilesWithContentReady;
result.numberOfTilesTotal = statistics.numberOfTilesTotal;
result.numberOfFeaturesSelected = statistics.numberOfFeaturesSelected;
result.numberOfFeaturesLoaded = statistics.numberOfFeaturesLoaded;
result.numberOfPointsSelected = statistics.numberOfPointsSelected;
result.numberOfPointsLoaded = statistics.numberOfPointsLoaded;
result.numberOfTrianglesSelected = statistics.numberOfTrianglesSelected;
result.numberOfTilesStyled = statistics.numberOfTilesStyled;
result.numberOfFeaturesStyled = statistics.numberOfFeaturesStyled;
result.numberOfTilesCulledWithChildrenUnion =
statistics.numberOfTilesCulledWithChildrenUnion;
result.geometryByteLength = statistics.geometryByteLength;
result.texturesByteLength = statistics.texturesByteLength;
result.texturesReferenceCounterById = {
...statistics.texturesReferenceCounterById,
};
result.batchTableByteLength = statistics.batchTableByteLength;
};
export default Cesium3DTilesetStatistics;