folk-canvas/lib/rAF.ts

27 lines
671 B
TypeScript

const callbacks = new Set<FrameRequestCallback>();
let rAFId = -1;
function onRAF(time: DOMHighResTimeStamp) {
rAFId = -1;
const values = Array.from(callbacks);
callbacks.clear();
values.forEach((callback) => callback(time));
}
// Batch multiple callbacks into a single rAF for better performance
export function requestAnimationFrame(callback: FrameRequestCallback) {
if (callbacks.size === 0) {
rAFId = window.requestAnimationFrame(onRAF);
}
callbacks.add(callback);
}
export function cancelAnimationFrame(callback: FrameRequestCallback) {
callbacks.delete(callback);
if (callbacks.size === 0) {
window.cancelAnimationFrame(rAFId);
}
}