Skip to content

Commit 8bcfc13

Browse files
committed
refactor: update ticking mechanism
1 parent a93bd4d commit 8bcfc13

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

src/index.ts

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ export function createFrame<T extends string = PhaseIDs>(
9999
let isPaused: boolean = false
100100

101101
const frameInterval: number = 1000 / (fps || 60)
102+
const maxDeltaTime: number = 40
102103
let lastFrameTime: number = 0
103104
let lastPauseTime: number | null = null
104105
let totalPausedTime: number = 0
105-
let useFrameInterval: boolean = true
106106

107107
let state: FrameState = defaultState()
108108

@@ -169,9 +169,13 @@ export function createFrame<T extends string = PhaseIDs>(
169169
if (isBrowser) tickerId = requestAnimationFrame(runFrame)
170170
} else {
171171
const now = performance.now()
172+
const delta = now - lastFrameTime
173+
174+
lastFrameTime = now - (delta % frameInterval)
175+
172176
tickerId = setTimeout(
173-
() => runFrame(now),
174-
Math.max(0, frameInterval - (now - lastFrameTime)),
177+
runFrame,
178+
Math.max(0, frameInterval - delta),
175179
) as unknown as number
176180
}
177181
}
@@ -190,20 +194,28 @@ export function createFrame<T extends string = PhaseIDs>(
190194
}
191195
}
192196

193-
const runFrame = (timestamp: number): void => {
194-
const time = timestamp - totalPausedTime
197+
const runFrame = (): void => {
198+
const now = performance.now()
199+
const time = now - totalPausedTime
200+
195201
shouldRunTicker = loops.size > 0
196202

197203
if (fps) {
198204
const delta = time - lastFrameTime
199205
if (delta < frameInterval) {
200-
runTicker()
206+
if (!isPaused) runTicker()
201207
return
202208
}
203209
lastFrameTime = time - (delta % frameInterval)
210+
state.delta = frameInterval
211+
} else {
212+
state.delta =
213+
state.timestamp === 0
214+
? frameInterval
215+
: Math.min(Math.max(time - state.timestamp, 1), maxDeltaTime)
216+
lastFrameTime = time
204217
}
205218

206-
state.delta = useFrameInterval ? frameInterval : time - state.timestamp
207219
state.timestamp = time
208220
state.isPaused = isPaused
209221

@@ -213,10 +225,8 @@ export function createFrame<T extends string = PhaseIDs>(
213225

214226
state.isRunning = false
215227

216-
if (shouldRunTicker && !isPaused) {
217-
useFrameInterval = false
218-
runTicker()
219-
} else cancelTicker()
228+
if (shouldRunTicker && !isPaused) runTicker()
229+
else cancelTicker()
220230
}
221231

222232
const frame: Frame<T> = {
@@ -261,7 +271,7 @@ export function createFrame<T extends string = PhaseIDs>(
261271
options: PhaseScheduleOptions = {},
262272
) => {
263273
if (!shouldRunTicker) {
264-
useFrameInterval = true
274+
shouldRunTicker = true
265275
lastFrameTime = performance.now()
266276
runTicker()
267277
}

0 commit comments

Comments
 (0)