AnimationFrames
A wrapper over `requestAnimationFrame`, with controls for limiting FPS, and information about the current frame.
Demo
Frames: 0 FPS: 0 Delta: 0ms
FPS limit: 10
Mouse sprite extracted from Animal Well
Description
AnimationFrames wraps over requestAnimationFrame.
While it is not necessary to use it to use requestAnimationFrame, it removes some of the
boilerplate, and adds common utilities for it.
- Automatically interrupts the requestAnimationFrame loop once the component is unmounted
- Lets you set an FPS limit
- Lets you get information about the current frame, such as its current timestamp, and the difference in ms between the last frame and the current one
- Returns information about current FPS
Usage
<script lang="ts">
import { AnimationFrames } from "runed";
import { Slider } from "../ui/slider"; // Check out shadcn-svelte!
let frames = $state(0);
let fpsLimit = $state(10);
let delta = $state(0);
const animation = new AnimationFrames(
(args) => {
frames++;
delta = args.delta;
},
{ fpsLimit: () => fpsLimit }
);
const stats = $derived(
`Frames: ${frames}\nFPS: ${animation.fps.toFixed(0)}\nDelta: ${delta.toFixed(0)}ms`
);
</script>
<pre>{stats}</pre>
<button onclick={toggle}>
{animation.running ? "Stop" : "Start"}
</button>
<p>
FPS limit: <b>{fpsLimit}</b><i>{fpsLimit === 0 ? " (not limited)" : ""}</i>
</p>
<Slider
value={[fpsLimit]}
onValueChange={(value) => (fpsLimit = value[0] ?? 0)}
min={0}
max={144} />