yoni-mcscripts-lib
Version:
为 Minecraft Script API 中的部分接口创建了 wrapper,并提供简单的事件管理器和任务管理器,另附有一些便于代码编写的一些小工具。
42 lines (41 loc) • 1.72 kB
JavaScript
import { YoniScheduler } from "../schedule.js";
let tickTimeRecords = [];
let maxRecordTicks = 20;
YoniScheduler.runCycleTickTask(countTPS, 1, 1, false);
function countTPS() {
tickTimeRecords.unshift(Date.now());
if (tickTimeRecords.length > maxRecordTicks + 1)
tickTimeRecords.length = maxRecordTicks + 1;
}
export class TPSCounter {
static get maxRecordTicks() {
return maxRecordTicks;
}
static set maxRecordTicks(v) {
v = Number(v);
if (isNaN(v) || v < 1)
throw new TypeError("value not valid");
maxRecordTicks = Math.floor(v);
}
/**
* @param recentSeconds 指定计算使用的时间长度。
* @param tickRate 指定每秒 tick 数。
* @returns 若过去的时间内尚无记录,返回 `-1`,否则返回计算得到的TPS。
*/
static getTPS(recentSeconds = 1, tickRate = 20) {
if (recentSeconds * 1000 > tickTimeRecords[0] - tickTimeRecords[tickTimeRecords.length - 1]) {
// not such record
return -1;
}
const shouldPassedTicks = recentSeconds * tickRate;
const totalRecordedTicks = tickTimeRecords.length - 1;
const oldestTickRecordIndex = Math.min(Math.floor(shouldPassedTicks), totalRecordedTicks);
const oldestTickTime = tickTimeRecords[oldestTickRecordIndex];
const lastTickTime = tickTimeRecords[0];
const intervalBetweenStartEndRecord = lastTickTime - oldestTickTime;
const tickingTime = Math.max(intervalBetweenStartEndRecord, recentSeconds);
const tps = 1000 / (tickingTime / shouldPassedTicks);
const normalizedTPS = Math.round(tps * 100) / 100;
return normalizedTPS;
}
}