update(time) {
		// handle frame skipping if required
		if (++this.frameCounter % this.frameRate === 0) {
			// reset the frame counter
			this.frameCounter = 0;

			// publish notification
			eventEmitter.emit(GAME_BEFORE_UPDATE, time);
			this.accumulator += timer.getDelta();
			this.accumulator = Math.min(this.accumulator, this.accumulatorMax);

			this.updateDelta = timer.interpolation ? timer.getDelta() : this.stepSize;
			this.accumulatorUpdateDelta = timer.interpolation
				? this.updateDelta
				: Math.max(this.updateDelta, this.updateAverageDelta);

			while (
				this.accumulator >= this.accumulatorUpdateDelta ||
				timer.interpolation
			) {
				this.lastUpdateStart = globalThis.performance.now();

				// game update event
				if (state.isPaused() !== true) {
					eventEmitter.emit(GAME_UPDATE, time);
				}

				// update all objects (and pass the elapsed time since last frame)
				this.isDirty = this.world.update(this.updateDelta);
				this.isDirty = state.current().update(this.updateDelta) || this.isDirty;

				this.lastUpdate = globalThis.performance.now();
				this.updateAverageDelta = this.lastUpdate - this.lastUpdateStart;

				this.accumulator -= this.accumulatorUpdateDelta;
				if (timer.interpolation) {
					this.accumulator = 0;
					break;
				}
			}

			// publish notification
			eventEmitter.emit(GAME_AFTER_UPDATE, this.lastUpdate);
		}
	}
update all objects related to this game active scene/stage
@param {number} time - current timestamp as provided by the RAF callback