Files
esengine/source/src/ECS/Utils/Time.ts
yhh caa3ffc8f5 1.新增es.TimeUtils
2.优化并给部分类添加注释
3.移除fasterDictionary
2023-03-13 23:32:24 +08:00

93 lines
3.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
module es {
/**
* 时间管理器,用于管理游戏中的时间相关属性
*/
export class Time {
/** 游戏运行的总时间,单位为秒 */
public static totalTime: number = 0;
/** deltaTime 的未缩放版本,不受时间尺度的影响 */
public static unscaledDeltaTime: number = 0;
/** 前一帧到当前帧的时间增量,按时间刻度进行缩放 */
public static deltaTime: number = 0;
/** 时间刻度缩放,可以加快或减慢游戏时间 */
public static timeScale = 1;
/** DeltaTime 可以为的最大值,避免游戏出现卡顿情况 */
public static maxDeltaTime = Number.MAX_VALUE;
/** 已传递的帧总数 */
public static frameCount = 0;
/** 自场景加载以来的总时间,单位为秒 */
public static timeSinceSceneLoad: number = 0;
/** 上一次记录的时间,用于计算两次调用 update 之间的时间差 */
private static _lastTime = -1;
/**
* 更新时间管理器
* @param currentTime 当前时间
* @param useEngineTime 是否使用引擎时间
*/
public static update(currentTime: number, useEngineTime: boolean) {
let dt = 0;
if (useEngineTime) {
dt = currentTime;
} else {
// 如果当前时间为 -1则表示使用系统时间
if (currentTime === -1) {
currentTime = Date.now();
}
// 如果上一次记录的时间为 -1则表示当前为第一次调用 update
if (this._lastTime === -1) {
this._lastTime = currentTime;
}
// 计算两次调用 update 之间的时间差,并将其转换为秒
dt = (currentTime - this._lastTime) / 1000;
}
// 如果计算得到的时间差超过了最大时间步长,则将其限制为最大时间步长
if (dt > this.maxDeltaTime) {
dt = this.maxDeltaTime;
}
// 更新时间管理器的各个属性
this.totalTime += dt;
this.deltaTime = dt * this.timeScale;
this.unscaledDeltaTime = dt;
this.timeSinceSceneLoad += dt;
this.frameCount++;
// 记录当前时间,以备下一次调用 update 使用
this._lastTime = currentTime;
}
public static sceneChanged() {
this.timeSinceSceneLoad = 0;
}
/**
* 检查指定时间间隔是否已过去
* @param interval 指定时间间隔
* @returns 是否已过去指定时间间隔
*/
public static checkEvery(interval: number): boolean {
// 计算当前时刻所经过的完整时间间隔个数(向下取整)
const passedIntervals = Math.floor(this.timeSinceSceneLoad / interval);
// 计算上一帧到当前帧经过的时间所包含的时间间隔个数(向下取整)
const deltaIntervals = Math.floor(this.deltaTime / interval);
// 如果当前时刻所经过的时间间隔数比上一帧所经过的时间间隔数多,则说明时间间隔已过去
return passedIntervals > deltaIntervals;
}
}
}