diff options
| author | Acid Chicken (硫酸鶏) <root@acid-chicken.com> | 2023-05-20 03:38:07 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-05-20 03:38:07 +0900 |
| commit | ee3f408c7d25accb5812c4f442ba7f4531e4b681 (patch) | |
| tree | b3b3e170abf923127c9fa00e09de276ffe4fcb2e /packages/frontend/src/scripts | |
| parent | delete /docs (diff) | |
| download | sharkey-ee3f408c7d25accb5812c4f442ba7f4531e4b681.tar.gz sharkey-ee3f408c7d25accb5812c4f442ba7f4531e4b681.tar.bz2 sharkey-ee3f408c7d25accb5812c4f442ba7f4531e4b681.zip | |
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.
Diffstat (limited to 'packages/frontend/src/scripts')
| -rw-r--r-- | packages/frontend/src/scripts/idle-render.ts | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/packages/frontend/src/scripts/idle-render.ts b/packages/frontend/src/scripts/idle-render.ts new file mode 100644 index 0000000000..ccce8b02bf --- /dev/null +++ b/packages/frontend/src/scripts/idle-render.ts @@ -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(); |