Skip to content

Commit 3759b69

Browse files
committed
add boolean flag to primitive to calculate statistics
1 parent 254ae74 commit 3759b69

File tree

5 files changed

+84
-25
lines changed

5 files changed

+84
-25
lines changed

CHANGES.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#### Additions :tada:
1313

1414
- Add `ITwinData.loadGeospatialFeatures(iTwinId, collectionId)` function to load data from the [Geospatial Features API](https://developer.bentley.com/apis/geospatial-features/operations/get-features/) [#12449](https://github.com/CesiumGS/cesium/pull/12449)
15-
- Implemented `texturesByteLength`, `visited`, and `numberOfTilesWithContentReady` in `VoxelPrimitive.statistics`.
15+
- Implemented `texturesByteLength`, `visited`, and `numberOfTilesWithContentReady` in `VoxelPrimitive.statistics`. To use statistics, set `options.calculateStatistics` to `true` in the constructor. Note `VoxelPrimitive` is experimental.
1616

1717
#### Fixes :wrench:
1818

packages/engine/Source/Scene/VoxelPrimitive.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import Cesium3DTilesetStatistics from "./Cesium3DTilesetStatistics.js";
3838
* @param {Matrix4} [options.modelMatrix=Matrix4.IDENTITY] The model matrix used to transform the primitive.
3939
* @param {CustomShader} [options.customShader] The custom shader used to style the primitive.
4040
* @param {Clock} [options.clock] The clock used to control time dynamic behavior.
41+
* @param {Boolean} [options.calculateStatistics] Generate statistics for performance profile.
4142
*
4243
* @see VoxelProvider
4344
* @see Cesium3DTilesVoxelProvider
@@ -77,6 +78,12 @@ function VoxelPrimitive(options) {
7778
*/
7879
this._statistics = new Cesium3DTilesetStatistics();
7980

81+
/**
82+
* @type {boolean}
83+
* @private
84+
*/
85+
this._calculateStatistics = defaultValue(options.calculateStatistics, false);
86+
8087
/**
8188
* This member is not created until the provider is ready.
8289
*
@@ -1062,6 +1069,7 @@ Object.defineProperties(VoxelPrimitive.prototype, {
10621069

10631070
/**
10641071
* Loading and rendering information for requested content
1072+
* To use `visited` and `numberOfTilesWithContentReady` statistics, set options._calculateStatistics` to `true` in the constructor.
10651073
* @type {Cesium3DTilesetStatistics}
10661074
* @readonly
10671075
* @private
@@ -1145,8 +1153,6 @@ VoxelPrimitive.prototype.update = function (frameState) {
11451153
this._clock,
11461154
);
11471155

1148-
this.statistics.clear();
1149-
11501156
const traversal = this._traversal;
11511157
const sampleCountOld = traversal._sampleCount;
11521158

packages/engine/Source/Scene/VoxelTraversal.js

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Cartesian2 from "../Core/Cartesian2.js";
22
import CesiumMath from "../Core/Math.js";
33
import CullingVolume from "../Core/CullingVolume.js";
4+
import defaultValue from "../Core/defaultValue.js";
45
import defined from "../Core/defined.js";
56
import destroyObject from "../Core/destroyObject.js";
67
import DoubleEndedPriorityQueue from "../Core/DoubleEndedPriorityQueue.js";
@@ -93,6 +94,15 @@ function VoxelTraversal(
9394
*/
9495
this._debugPrint = false;
9596

97+
/**
98+
* @type {boolean}
99+
* @private
100+
*/
101+
this._calculateStatistics = defaultValue(
102+
this._primitive._calculateStatistics,
103+
false,
104+
);
105+
96106
/**
97107
* @type {number}
98108
* @private
@@ -332,16 +342,23 @@ VoxelTraversal.prototype.update = function (
332342
generateOctree(this, sampleCount, levelBlendFactor);
333343
const timestamp2 = getTimestamp();
334344

335-
const loadAndUnloadTimeMs = timestamp1 - timestamp0;
336-
const generateOctreeTimeMs = timestamp2 - timestamp1;
337-
const totalTimeMs = timestamp2 - timestamp0;
338-
postPassesUpdate(
339-
this,
340-
frameState,
341-
loadAndUnloadTimeMs,
342-
generateOctreeTimeMs,
343-
totalTimeMs,
344-
);
345+
const checkEventListeners =
346+
primitive.loadProgress.numberOfListeners > 0 ||
347+
primitive.allTilesLoaded.numberOfListeners > 0 ||
348+
primitive.initialTilesLoaded.numberOfListeners > 0;
349+
350+
if (this._debugPrint || this._calculateStatistics || checkEventListeners) {
351+
const loadAndUnloadTimeMs = timestamp1 - timestamp0;
352+
const generateOctreeTimeMs = timestamp2 - timestamp1;
353+
const totalTimeMs = timestamp2 - timestamp0;
354+
postPassesUpdate(
355+
this,
356+
frameState,
357+
loadAndUnloadTimeMs,
358+
generateOctreeTimeMs,
359+
totalTimeMs,
360+
);
361+
}
345362
};
346363

347364
/**
@@ -794,14 +811,6 @@ function postPassesUpdate(
794811
loadStateByCount[KeyframeNode.LoadState.LOADED];
795812
primitive.statistics.visited = nodeCountTotal;
796813

797-
const checkEventListeners =
798-
primitive.loadProgress.numberOfListeners > 0 ||
799-
primitive.allTilesLoaded.numberOfListeners > 0 ||
800-
primitive.initialTilesLoaded.numberOfListeners > 0;
801-
if (!that._debugPrint && !checkEventListeners) {
802-
return;
803-
}
804-
805814
const numberOfPendingRequests =
806815
loadStateByCount[KeyframeNode.LoadState.RECEIVING];
807816
const numberOfTilesProcessing =

packages/engine/Specs/Scene/VoxelPrimitiveSpec.js

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ describe(
7070
expect(spyUpdate.calls.count()).toEqual(1);
7171
});
7272

73-
it("initial tiles loaded and all tiles loaded events are raised and statistics are updates", async function () {
73+
it("initial tiles loaded and all tiles loaded events are raised", async function () {
7474
const spyUpdate1 = jasmine.createSpy("listener");
7575
const spyUpdate2 = jasmine.createSpy("listener");
7676
const primitive = new VoxelPrimitive({ provider });
@@ -83,11 +83,56 @@ describe(
8383
});
8484
expect(spyUpdate1.calls.count()).toEqual(1);
8585
expect(spyUpdate2.calls.count()).toEqual(1);
86+
});
87+
88+
it("statistics are updated when event listeners are assigned", async function () {
89+
const spyUpdate1 = jasmine.createSpy("listener");
90+
const spyUpdate2 = jasmine.createSpy("listener");
91+
const primitive = new VoxelPrimitive({ provider });
92+
scene.primitives.add(primitive);
93+
primitive.allTilesLoaded.addEventListener(spyUpdate1);
94+
primitive.initialTilesLoaded.addEventListener(spyUpdate2);
95+
await pollToPromise(() => {
96+
scene.renderForSpecs();
97+
return primitive._traversal._initialTilesLoaded;
98+
});
8699
expect(primitive.statistics.numberOfTilesWithContentReady).toEqual(1);
87100
expect(primitive.statistics.visited).toEqual(1);
88101
expect(primitive.statistics.texturesByteLength).toEqual(134217728);
89102
});
90103

104+
it("statistics are updated when constructor option is true", async function () {
105+
const primitive = new VoxelPrimitive({
106+
provider,
107+
calculateStatistics: true,
108+
});
109+
scene.primitives.add(primitive);
110+
await pollToPromise(() => {
111+
scene.renderForSpecs();
112+
return primitive.ready;
113+
});
114+
await pollToPromise(() => {
115+
scene.renderForSpecs();
116+
return primitive._traversal._initialTilesLoaded;
117+
});
118+
expect(primitive.statistics.numberOfTilesWithContentReady).toEqual(1);
119+
expect(primitive.statistics.visited).toEqual(1);
120+
});
121+
122+
it("statistics are not updated when constructor option is false", async function () {
123+
const primitive = new VoxelPrimitive({ provider });
124+
scene.primitives.add(primitive);
125+
await pollToPromise(() => {
126+
scene.renderForSpecs();
127+
return primitive.ready;
128+
});
129+
for (let i = 0; i < 10; i++) {
130+
scene.renderForSpecs();
131+
}
132+
expect(primitive.statistics.numberOfTilesWithContentReady).toEqual(0);
133+
expect(primitive.statistics.visited).toEqual(0);
134+
});
135+
91136
it("tile load, load progress and tile visible events are raised", async function () {
92137
const spyUpdate1 = jasmine.createSpy("listener");
93138
const spyUpdate2 = jasmine.createSpy("listener");

packages/engine/Specs/Scene/VoxelTraversalSpec.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,12 +173,11 @@ describe(
173173

174174
const megatexture = traversal.megatextures[0];
175175
expect(megatexture.occupiedCount).toBe(1);
176-
expect(traversal._primitive.statistics.texturesByteLength).toEqual(
177-
134217728,
178-
);
176+
expect(traversal.textureMemoryByteLength).toEqual(500);
179177
});
180178

181179
it("tile failed event is raised", async function () {
180+
traversal._calculateStatistics = true;
182181
const keyFrameLocation = 0;
183182
const recomputeBoundingVolumes = true;
184183
const pauseUpdate = false;

0 commit comments

Comments
 (0)