feat: impl IdlingRenderScheduler (#10547)
* feat: impl IdleRender * test: pin time on Chromatic * test: pin time on Chromatic * fix: typo * style: rename * style: rename * chore: back to setTimeout * style: linebreak * refactor: remove unused budget option * refactor: use raw unix time * fix: conflict error * fix: floor * fix: subtract * Revert "fix: subtract" This reverts commit 2ef4afaafc69d2fb8329b04c1b124dfa97b7e863. * Revert "fix: floor" This reverts commit bef8ecdf45c6afc52138921d16e2caca78cfd38d. * Revert "refactor: use raw unix time" This reverts commit 5199e13cb2829f3036101f95445cca3cb9c83703.
This commit is contained in:
parent
1eb35dd5bc
commit
ee3f408c7d
7 changed files with 100 additions and 29 deletions
38
packages/frontend/src/scripts/idle-render.ts
Normal file
38
packages/frontend/src/scripts/idle-render.ts
Normal file
|
@ -0,0 +1,38 @@
|
|||
class IdlingRenderScheduler {
|
||||
#renderers: Set<FrameRequestCallback>;
|
||||
#rafId: number;
|
||||
#ricId: number;
|
||||
|
||||
constructor() {
|
||||
this.#renderers = new Set();
|
||||
this.#rafId = 0;
|
||||
this.#ricId = requestIdleCallback((deadline) => this.#schedule(deadline));
|
||||
}
|
||||
|
||||
#schedule(deadline: IdleDeadline): void {
|
||||
if (deadline.timeRemaining()) {
|
||||
this.#rafId = requestAnimationFrame((time) => {
|
||||
for (const renderer of this.#renderers) {
|
||||
renderer(time);
|
||||
}
|
||||
});
|
||||
}
|
||||
this.#ricId = requestIdleCallback((arg) => this.#schedule(arg));
|
||||
}
|
||||
|
||||
add(renderer: FrameRequestCallback): void {
|
||||
this.#renderers.add(renderer);
|
||||
}
|
||||
|
||||
delete(renderer: FrameRequestCallback): void {
|
||||
this.#renderers.delete(renderer);
|
||||
}
|
||||
|
||||
dispose(): void {
|
||||
this.#renderers.clear();
|
||||
cancelAnimationFrame(this.#rafId);
|
||||
cancelIdleCallback(this.#ricId);
|
||||
}
|
||||
}
|
||||
|
||||
export const defaultIdlingRenderScheduler = new IdlingRenderScheduler();
|
Loading…
Add table
Add a link
Reference in a new issue