You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
7.7 KiB
JavaScript
258 lines
7.7 KiB
JavaScript
import { defined } from "../../Source/Cesium.js";
|
|
import { getTimestamp } from "../../Source/Cesium.js";
|
|
import { FrameRateMonitor } from "../../Source/Cesium.js";
|
|
import createScene from "../createScene.js";
|
|
|
|
describe(
|
|
"Scene/FrameRateMonitor",
|
|
function () {
|
|
var scene;
|
|
beforeAll(function () {
|
|
scene = createScene();
|
|
});
|
|
|
|
afterAll(function () {
|
|
scene.destroyForSpecs();
|
|
});
|
|
|
|
var monitor;
|
|
afterEach(function () {
|
|
if (defined(monitor)) {
|
|
monitor.destroy();
|
|
monitor = undefined;
|
|
}
|
|
});
|
|
|
|
function spinWait(milliseconds) {
|
|
var endTime = getTimestamp() + milliseconds;
|
|
/*eslint-disable no-empty*/
|
|
while (getTimestamp() < endTime) {}
|
|
/*eslint-enable no-empty*/
|
|
}
|
|
|
|
it("throws when constructed without a scene", function () {
|
|
expect(function () {
|
|
monitor = new FrameRateMonitor();
|
|
}).toThrowDeveloperError();
|
|
|
|
expect(function () {
|
|
monitor = new FrameRateMonitor({});
|
|
}).toThrowDeveloperError();
|
|
});
|
|
|
|
it("can be constructed with just a scene", function () {
|
|
monitor = new FrameRateMonitor({
|
|
scene: scene,
|
|
});
|
|
|
|
expect(monitor.samplingWindow).toBe(5.0);
|
|
expect(monitor.quietPeriod).toBe(2.0);
|
|
expect(monitor.warmupPeriod).toBe(5.0);
|
|
expect(monitor.minimumFrameRateDuringWarmup).toBe(4);
|
|
expect(monitor.minimumFrameRateAfterWarmup).toBe(8);
|
|
expect(monitor.scene).toBe(scene);
|
|
expect(monitor.lowFrameRate.numberOfListeners).toBe(0);
|
|
expect(monitor.nominalFrameRate.numberOfListeners).toBe(0);
|
|
});
|
|
|
|
it("honors parameters to the constructor", function () {
|
|
monitor = new FrameRateMonitor({
|
|
scene: scene,
|
|
samplingWindow: 3.0,
|
|
quietPeriod: 1.0,
|
|
warmupPeriod: 6.0,
|
|
minimumFrameRateDuringWarmup: 1,
|
|
minimumFrameRateAfterWarmup: 2,
|
|
});
|
|
|
|
expect(monitor.samplingWindow).toBe(3.0);
|
|
expect(monitor.quietPeriod).toBe(1.0);
|
|
expect(monitor.warmupPeriod).toBe(6.0);
|
|
expect(monitor.minimumFrameRateDuringWarmup).toBe(1);
|
|
expect(monitor.minimumFrameRateAfterWarmup).toBe(2);
|
|
expect(monitor.scene).toBe(scene);
|
|
});
|
|
|
|
it("raises the lowFrameRate event on low frame rate", function () {
|
|
monitor = new FrameRateMonitor({
|
|
scene: scene,
|
|
quietPeriod: 0.001,
|
|
warmupPeriod: 0.001,
|
|
samplingWindow: 0.001,
|
|
minimumFrameRateDuringWarmup: 1000,
|
|
minimumFrameRateAfterWarmup: 1000,
|
|
});
|
|
|
|
var spyListener = jasmine.createSpy("listener");
|
|
monitor.lowFrameRate.addEventListener(spyListener);
|
|
|
|
// Rendering once starts the quiet period
|
|
scene.render();
|
|
|
|
// Wait until we're well past the end of the quiet period.
|
|
spinWait(2);
|
|
|
|
// Rendering again records our first sample.
|
|
scene.render();
|
|
|
|
// Wait well over a millisecond, which is the maximum frame time allowed by this instance.
|
|
spinWait(2);
|
|
|
|
// Record our second sample. The monitor should notice that our frame rate is too low.
|
|
scene.render();
|
|
|
|
expect(monitor.lastFramesPerSecond).toBeLessThan(1000);
|
|
expect(spyListener).toHaveBeenCalled();
|
|
});
|
|
|
|
it("does not monitor frame rate while paused", function () {
|
|
monitor = new FrameRateMonitor({
|
|
scene: scene,
|
|
quietPeriod: 0.001,
|
|
warmupPeriod: 0.001,
|
|
samplingWindow: 0.001,
|
|
minimumFrameRateDuringWarmup: 1000,
|
|
minimumFrameRateAfterWarmup: 1000,
|
|
});
|
|
|
|
var spyListener = jasmine.createSpy("listener");
|
|
monitor.lowFrameRate.addEventListener(spyListener);
|
|
|
|
// Rendering once starts the quiet period
|
|
scene.render();
|
|
|
|
// Wait until we're well past the end of the quiet period.
|
|
spinWait(2);
|
|
|
|
// Rendering again records our first sample.
|
|
scene.render();
|
|
|
|
monitor.pause();
|
|
|
|
// Wait well over a millisecond, which is the maximum frame time allowed by this instance.
|
|
spinWait(2);
|
|
|
|
// Record our second sample. The monitor would notice that our frame rate is too low,
|
|
// but it's paused.
|
|
scene.render();
|
|
|
|
monitor.unpause();
|
|
|
|
scene.render();
|
|
|
|
expect(spyListener).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("pausing multiple times requires unpausing multiple times", function () {
|
|
monitor = new FrameRateMonitor({
|
|
scene: scene,
|
|
quietPeriod: 0.001,
|
|
warmupPeriod: 0.001,
|
|
samplingWindow: 0.001,
|
|
minimumFrameRateDuringWarmup: 1000,
|
|
minimumFrameRateAfterWarmup: 1000,
|
|
});
|
|
|
|
var spyListener = jasmine.createSpy("listener");
|
|
monitor.lowFrameRate.addEventListener(spyListener);
|
|
|
|
monitor.pause();
|
|
monitor.pause();
|
|
monitor.unpause();
|
|
|
|
// Rendering once starts the quiet period
|
|
scene.render();
|
|
|
|
// Wait until we're well past the end of the quiet period.
|
|
spinWait(2);
|
|
|
|
// Rendering again records our first sample.
|
|
scene.render();
|
|
|
|
// Wait well over a millisecond, which is the maximum frame time allowed by this instance.
|
|
spinWait(2);
|
|
|
|
// Record our second sample. The monitor would notice that our frame rate is too low,
|
|
// but it's paused.
|
|
scene.render();
|
|
|
|
monitor.unpause();
|
|
|
|
scene.render();
|
|
|
|
expect(spyListener).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("does not report a low frame rate during the quiet period", function () {
|
|
monitor = new FrameRateMonitor({
|
|
scene: scene,
|
|
quietPeriod: 1.0,
|
|
warmupPeriod: 0.001,
|
|
samplingWindow: 0.001,
|
|
minimumFrameRateDuringWarmup: 1000,
|
|
minimumFrameRateAfterWarmup: 1000,
|
|
});
|
|
|
|
var spyListener = jasmine.createSpy("listener");
|
|
monitor.lowFrameRate.addEventListener(spyListener);
|
|
|
|
// Rendering once starts the quiet period
|
|
scene.render();
|
|
|
|
// Wait well over a millisecond, which is the maximum frame time allowed by this instance.
|
|
spinWait(2);
|
|
|
|
// Render again. Even though our frame rate is too low, the monitor shouldn't raise the event because we're in the quiet period.
|
|
scene.render();
|
|
|
|
expect(spyListener).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it("the nominalFrameRate event is raised after the warmup period if the frame rate returns to nominal", function () {
|
|
monitor = new FrameRateMonitor({
|
|
scene: scene,
|
|
quietPeriod: 0.001,
|
|
warmupPeriod: 0.001,
|
|
samplingWindow: 0.001,
|
|
minimumFrameRateDuringWarmup: 10,
|
|
minimumFrameRateAfterWarmup: 10,
|
|
});
|
|
|
|
var lowListener = jasmine.createSpy("lowFrameRate");
|
|
monitor.lowFrameRate.addEventListener(lowListener);
|
|
|
|
var nominalListener = jasmine.createSpy("nominalFrameRate");
|
|
monitor.nominalFrameRate.addEventListener(nominalListener);
|
|
|
|
// Rendering once starts the quiet period
|
|
scene.render();
|
|
|
|
// Wait until we're well past the end of the quiet period.
|
|
spinWait(2);
|
|
|
|
// Rendering again records our first sample.
|
|
scene.render();
|
|
|
|
// Wait 120 millseconds, which is over the maximum frame time allowed by this instance.
|
|
spinWait(120);
|
|
|
|
// Record our second sample. The monitor should notice that our frame rate is too low.
|
|
scene.render();
|
|
|
|
expect(monitor.lastFramesPerSecond).toBeLessThan(10);
|
|
expect(lowListener).toHaveBeenCalled();
|
|
|
|
// Render as fast as possible for a samplingWindow, quietPeriod, and warmupPeriod.
|
|
var endTime = getTimestamp() + 50;
|
|
while (getTimestamp() < endTime) {
|
|
scene.render();
|
|
}
|
|
|
|
// The nominalFrameRate event should have been raised.
|
|
expect(monitor.lastFramesPerSecond).toBeGreaterThanOrEqualTo(10);
|
|
expect(nominalListener).toHaveBeenCalled();
|
|
});
|
|
},
|
|
"WebGL"
|
|
);
|