Skip to content

Commit 45feac0

Browse files
committed
udpdate engine and add fps-meter
1 parent 5b183d4 commit 45feac0

File tree

6 files changed

+127
-13
lines changed

6 files changed

+127
-13
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"@codemirror/lang-javascript": "^6.2.4",
2525
"@codemirror/theme-one-dark": "^6.1.2",
2626
"@litecanvas/plugin-asset-loader": "latest",
27+
"@litecanvas/plugin-frame-rate-meter": "latest",
2728
"@litecanvas/plugin-migrate": "latest",
2829
"@litecanvas/utils": "latest",
2930
"codemirror": "^6.0.1",

public/about.html

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@
8686
font-size: 1.2rem;
8787
text-transform: uppercase;
8888
}
89+
small {
90+
font-size: 80%;
91+
}
8992
ul li {
9093
font-size: 1.2rem;
9194
line-height: 2;
@@ -133,6 +136,10 @@
133136
display: block;
134137
text-align: center;
135138
}
139+
#extra-packages li {
140+
margin-bottom: 1rem;
141+
line-height: 1.3;
142+
}
136143

137144
@media print {
138145
html {
@@ -715,14 +722,30 @@ <h3>Extra packages</h3>
715722
The following packages are automatically loaded into the playground:
716723
</p>
717724

718-
<ul>
725+
<ul id="extra-packages">
719726
<li>
720727
<strong>
721728
<a href="https://github.com/litecanvas/plugin-asset-loader">
722729
https://github.com/litecanvas/plugin-asset-loader
723730
</a>
724731
</strong>
725732
</li>
733+
<li>
734+
<strong>
735+
<a href="https://github.com/litecanvas/plugin-frame-rate-meter">
736+
https://github.com/litecanvas/plugin-frame-rate-meter
737+
</a>
738+
</strong>
739+
<br>
740+
<small><em>Tip: Press <code>F1</code> to show the FPS monitor in the preview</em></small>
741+
</li>
742+
<li>
743+
<strong>
744+
<a href="https://github.com/litecanvas/plugin-migrate">
745+
https://github.com/litecanvas/plugin-migrate
746+
</a>
747+
</strong>
748+
</li>
726749
<li>
727750
<strong>
728751
<a href="https://github.com/litecanvas/utils">

public/litecanvas.js

Lines changed: 91 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,7 @@
849849
"function" === typeof callback,
850850
"listen: 2nd param must be a function"
851851
);
852+
eventName = eventName.toLowerCase();
852853
_events[eventName] = _events[eventName] || /* @__PURE__ */ new Set();
853854
_events[eventName].add(callback);
854855
return () => _events[eventName].delete(callback);
@@ -868,6 +869,7 @@
868869
"emit: 1st param must be a string"
869870
);
870871
if (_initialized) {
872+
eventName = eventName.toLowerCase();
871873
triggerEvent("before:" + eventName, arg1, arg2, arg3, arg4);
872874
triggerEvent(eventName, arg1, arg2, arg3, arg4);
873875
triggerEvent("after:" + eventName, arg1, arg2, arg3, arg4);
@@ -969,7 +971,9 @@
969971
// 11
970972
_fontFamily
971973
];
972-
return list[n];
974+
const data = { index: n, value: list[n] };
975+
instance.emit("stat", data);
976+
return data.value;
973977
},
974978
/**
975979
* Stops the litecanvas instance and remove all event listeners.
@@ -1137,25 +1141,24 @@
11371141
});
11381142
}
11391143
if (settings.keyboardEvents) {
1140-
const toLowerCase = (s) => s.toLowerCase();
11411144
const _keysDown = /* @__PURE__ */ new Set();
11421145
const _keysPress = /* @__PURE__ */ new Set();
1143-
const keyCheck = (keysSet, key) => {
1144-
return !key ? keysSet.size > 0 : keysSet.has(
1145-
"space" === toLowerCase(key) ? " " : toLowerCase(key)
1146-
);
1146+
const keyCheck = (keySet, key = "") => {
1147+
key = key.toLowerCase();
1148+
return !key ? keySet.size > 0 : keySet.has("space" === key ? " " : key);
11471149
};
11481150
on(root, "keydown", (event) => {
1149-
if (!_keysDown.has(toLowerCase(event.key))) {
1150-
_keysDown.add(toLowerCase(event.key));
1151-
_keysPress.add(toLowerCase(event.key));
1151+
const key = event.key.toLowerCase();
1152+
if (!_keysDown.has(key)) {
1153+
_keysDown.add(key);
1154+
_keysPress.add(key);
11521155
}
11531156
});
11541157
on(root, "keyup", (event) => {
1155-
_keysDown.delete(toLowerCase(event.key));
1158+
_keysDown.delete(event.key.toLowerCase());
11561159
});
11571160
on(root, "blur", () => _keysDown.clear());
1158-
instance.listen("after:draw", () => _keysPress.clear());
1161+
instance.listen("after:update", () => _keysPress.clear());
11591162
instance.def(
11601163
"iskeydown",
11611164
/**
@@ -2014,7 +2017,84 @@
20142017
}
20152018
window.pluginMigrate = p;
20162019
})();
2020+
(() => {
2021+
function A() {
2022+
let o = 0, a = true, i = document.createElement("div"), r = [], p = () => (performance || Date).now();
2023+
i.style.cssText = "position:absolute;top:0;right:0;cursor:pointer;opacity:0.8;z-index:10000", i.addEventListener("click", function(e) {
2024+
e.preventDefault(), l(++o % i.children.length);
2025+
}, false);
2026+
function u(e, n, _, t) {
2027+
let w = new P(e, n, _, i, t);
2028+
return r.push(w), w;
2029+
}
2030+
function l(e) {
2031+
for (let n = 0; n < i.children.length; n++) i.children[n].style.display = n === e ? "block" : "none";
2032+
o = e;
2033+
}
2034+
function f() {
2035+
o++, o >= i.children.length && (o = 0), l(o);
2036+
}
2037+
function s(e = "all") {
2038+
if (e === "all") for (let n = 0; n < r.length; n++) r[n].reset();
2039+
else r[e] && r[e].reset();
2040+
h = p(), y2 = 0;
2041+
}
2042+
function g(e = true) {
2043+
a = !!e, i.style.display = a ? "" : "none";
2044+
}
2045+
let b = p(), h = b, y2 = 0, c = u("FPS", "#0ff", "#002"), d = u("MS", "#0f0", "#020"), m;
2046+
return self.performance && self.performance.memory && (m = u("MB", "#f08", "#201")), l(0), { dom: i, addPanel: u, showPanel: l, nextPanel: f, resetPanel: s, display: g, get hidden() {
2047+
return !a;
2048+
}, begin: function() {
2049+
b = p();
2050+
}, end: function() {
2051+
y2++;
2052+
let e = p();
2053+
if (d.update(e - b, 200), e >= h + 1e3 && (c.update(y2 * 1e3 / (e - h), 100), h = e, y2 = 0, m)) {
2054+
let n = performance.memory;
2055+
m.update(n.usedJSHeapSize / 1048576, n.jsHeapSizeLimit / 1048576);
2056+
}
2057+
return e;
2058+
}, update: function() {
2059+
b = this.end();
2060+
} };
2061+
}
2062+
function P(o, a, i, r, p = {}) {
2063+
let u = Math.round, l = 1 / 0, f = 0, s = u(window.devicePixelRatio || 1), g = (p.width || 80) * s, b = 48 * s, h = 3 * s, y2 = 2 * s, c = 3 * s, d = 15 * s, m = (g - 6) * s, e = 30 * s, n = document.createElement("canvas");
2064+
n.width = g, n.height = b;
2065+
let _ = r.children.length;
2066+
r.appendChild(n);
2067+
let t = n.getContext("2d");
2068+
t.font = "bold " + 9 * s + "px Helvetica,Arial,sans-serif", t.textBaseline = "top";
2069+
function w() {
2070+
t.fillStyle = i, t.fillRect(0, 0, g, b), t.fillStyle = a, t.fillText(o, h, y2), t.fillRect(c, d, m, e), t.fillStyle = i, t.globalAlpha = 0.9, t.fillRect(c, d, m, e);
2071+
}
2072+
return w(), { id: _, dom: n, reset: w, update: function(x2, E) {
2073+
l = Math.min(l, x2), f = Math.max(f, x2), t.fillStyle = i, t.globalAlpha = 1, t.fillRect(0, 0, g, d), t.fillStyle = a;
2074+
let T = [u(x2), o];
2075+
p.labelBefore && T.reverse(), t.fillText(T.join(" ") + " (" + u(l) + "-" + u(f) + ")", h, y2), t.drawImage(n, c + s, d, m - s, e, c, d, m - s, e), t.fillRect(c + m - s, d, s, e), t.fillStyle = i, t.globalAlpha = 0.9, t.fillRect(c + m - s, d, s, u((1 - x2 / E) * e));
2076+
} };
2077+
}
2078+
var S = { hotkeyShow: "F1", hotkeyNext: "F2", css: {}, hidden: false, id: "" };
2079+
function v(o, a = {}) {
2080+
a = Object.assign({}, S, a);
2081+
let i = o.stat(0), r = new A(), p = r.display, u = (l = true) => {
2082+
console.log("display", l), a.hidden = !l, p(l), r.resetPanel();
2083+
};
2084+
a.id && (r.dom.id = a.id);
2085+
for (let [l, f] of Object.entries(a.css || {})) r.dom.style[l] = f;
2086+
return o.CANVAS.parentElement.appendChild(r.dom), u(!a.hidden), i.keyboardEvents && listen("update", () => {
2087+
a.hotkeyShow && o.iskeypressed(a.hotkeyShow) && u(a.hidden), a.hotkeyNext && o.iskeypressed(a.hotkeyNext) && r.nextPanel();
2088+
}), listen("before:update", (l, f = 1) => {
2089+
a.hidden || f === 1 && r.begin();
2090+
}), listen("after:draw", () => {
2091+
a.hidden || r.end();
2092+
}), r.display = u, { FPS_METER: r };
2093+
}
2094+
window.pluginFrameRateMeter = v;
2095+
})();
20172096
})();
20182097
/*! @litecanvas/utils by Luiz Bills | MIT Licensed */
20192098
/*! Asset Loader plugin for litecanvas by Luiz Bills | MIT Licensed */
20202099
/*! pluginMigrate for litecanvas v0.0.1 by Luiz Bills | MIT Licensed */
2100+
/*! pluginFrameRateMeter for litecanvas by Luiz Bills | MIT Licensed */

public/preview.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@
9393
window.litecanvas = (settings = {}) => {
9494
const instance = _litecanvas(settings);
9595
instance.use(pluginMigrate);
96+
instance.use(pluginFrameRateMeter, {
97+
hidden: true,
98+
});
9699
instance.listen("before:init", () => {
97100
instance.use(pluginAssetLoader);
98101
});

public/sw.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
const cacheName = "luizbills.litecanvas-editor-v1";
2-
const version = "2.84.0";
2+
const version = "2025.06.11.0";
33

44
const precacheResources = [
55
"/",

script/copy-files.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ const pluginMigrate = await readFile(
3131

3232
await appendFile(engineFile, "\n" + pluginMigrate);
3333

34+
const pluginFrameRateMeter = await readFile(
35+
root + "/node_modules/@litecanvas/plugin-frame-rate-meter/dist/dist.js",
36+
{ encoding: "utf8" }
37+
);
38+
39+
await appendFile(engineFile, "\n" + pluginFrameRateMeter);
40+
3441
await esbuild.build({
3542
entryPoints: [engineFile],
3643
outfile: engineFile,

0 commit comments

Comments
 (0)