From bfed67e2552c44c5bc1a58d4168f099fee5d758a Mon Sep 17 00:00:00 2001 From: schmelczerandras Date: Mon, 19 Oct 2020 11:41:47 +0200 Subject: [PATCH] Add delta time calculator --- src/helper/delta-time-calculator.ts | 44 +++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/helper/delta-time-calculator.ts diff --git a/src/helper/delta-time-calculator.ts b/src/helper/delta-time-calculator.ts new file mode 100644 index 0000000..87fd4c3 --- /dev/null +++ b/src/helper/delta-time-calculator.ts @@ -0,0 +1,44 @@ +/** + * A helper class for calculating the elapsed time between frames. + * + * Handles the case, where the browser tab is not in focus and `requestAnimationFrame` + * does not get called for performance reasons. In this case, the return deltaTime won't be + * an unreasonably large value. + */ +export class DeltaTimeCalculator { + private previousTime: DOMHighResTimeStamp | null = null; + private visibilityChangeHandler = this.handleVisibilityChange.bind(this); + + constructor() { + document.addEventListener('visibilitychange', this.visibilityChangeHandler); + } + + /** + * Return the elapsed time in **milliseconds** since the previous call of this + * method by subtracting the previously given `currentTime` argument from the + * current `currentTime` argument. + * + * Takes visibilitychange events into account. + * + * @param currentTime Current time acquired e.g. with `requestAnimationFrame`. + */ + public getNextDeltaTime(currentTime: DOMHighResTimeStamp): DOMHighResTimeStamp { + if (this.previousTime === null) { + this.previousTime = currentTime; + } + + const delta = currentTime - this.previousTime; + this.previousTime = currentTime; + return delta; + } + + public destroy() { + document.removeEventListener('visibilitychange', this.visibilityChangeHandler); + } + + private handleVisibilityChange() { + if (!document.hidden) { + this.previousTime = null; + } + } +}