|
1 | 1 | import addSmallStageClass from "../../libraries/common/cs/small-stage.js";
|
2 | 2 |
|
3 | 3 | export default async function ({ addon, console, msg }) {
|
4 |
| - await new Promise((resolve) => { |
5 |
| - if (addon.tab.traps.vm.editingTarget) return resolve(); |
6 |
| - addon.tab.traps.vm.runtime.once("PROJECT_LOADED", resolve); |
7 |
| - }); |
8 |
| - |
9 |
| - const renderer = addon.tab.traps.vm.runtime.renderer; |
| 4 | + const { vm } = addon.tab.traps; |
| 5 | + const { runtime } = vm; |
| 6 | + if (!vm.editingTarget) { |
| 7 | + await new Promise((resolve) => runtime.once("PROJECT_LOADED", resolve)); |
| 8 | + } |
10 | 9 |
|
11 | 10 | let fpsCounterElement = document.createElement("span");
|
12 | 11 | fpsCounterElement.className = "fps-counter";
|
13 |
| - |
14 | 12 | addon.tab.displayNoneWhileDisabled(fpsCounterElement);
|
15 | 13 | addSmallStageClass();
|
16 | 14 |
|
17 | 15 | const renderTimes = [];
|
18 |
| - var fps = "?"; |
19 |
| - var lastFps = 0; |
20 |
| - var firstTime = -1; |
| 16 | + let lastFps = 0; |
| 17 | + let wasRunning = false; |
21 | 18 |
|
22 |
| - renderer.ogDraw = renderer.draw; |
| 19 | + const { renderer } = runtime; |
| 20 | + const _draw = renderer.draw; |
23 | 21 | renderer.draw = function () {
|
24 |
| - const now = Date.now(); |
25 |
| - while (renderTimes.length > 0 && renderTimes[0] <= now - 2000) renderTimes.shift(); |
| 22 | + _draw.call(this); |
| 23 | + |
| 24 | + // Every time this function is ran, store the current time and remove times from half a second ago |
| 25 | + const now = runtime.currentMSecs; |
| 26 | + while (renderTimes.length > 0 && renderTimes[0] <= now - 500) renderTimes.shift(); |
| 27 | + // Calculate FPS times of each render frame. |
| 28 | + const allFps = renderTimes.map((time, i) => 1000 / ((renderTimes[i + 1] ?? now) - time)); |
26 | 29 | renderTimes.push(now);
|
27 |
| - fps = Math.floor(renderTimes.length / 2); |
28 |
| - if (firstTime === -1) firstTime = now; |
29 |
| - if (now - firstTime <= 2500) fps = "?"; |
| 30 | + let fps = 0; |
| 31 | + if (allFps.length !== 0) { |
| 32 | + // Average FPS times. |
| 33 | + fps = Math.round(allFps.reduce((prev, curr) => prev + curr, 0) / allFps.length); |
| 34 | + } |
| 35 | + |
| 36 | + // Show/Hide the element based on if there are any threads running |
| 37 | + if (runtime.threads.length === 0) { |
| 38 | + if (wasRunning) fpsCounterElement.classList.remove("show"); |
| 39 | + wasRunning = false; |
| 40 | + return; |
| 41 | + } |
| 42 | + if (!wasRunning) fpsCounterElement.classList.add("show"); |
| 43 | + wasRunning = true; |
| 44 | + |
| 45 | + // Update element text |
30 | 46 | if (fps !== lastFps) fpsCounterElement.innerText = msg("fpsCounter", { fps: (lastFps = fps) });
|
31 |
| - renderer.ogDraw(); |
32 | 47 | };
|
33 | 48 |
|
34 | 49 | while (true) {
|
|
0 commit comments