@@ -99,10 +99,10 @@ export function createFrame<T extends string = PhaseIDs>(
99
99
let isPaused : boolean = false
100
100
101
101
const frameInterval : number = 1000 / ( fps || 60 )
102
+ const maxDeltaTime : number = 40
102
103
let lastFrameTime : number = 0
103
104
let lastPauseTime : number | null = null
104
105
let totalPausedTime : number = 0
105
- let useFrameInterval : boolean = true
106
106
107
107
let state : FrameState = defaultState ( )
108
108
@@ -169,9 +169,13 @@ export function createFrame<T extends string = PhaseIDs>(
169
169
if ( isBrowser ) tickerId = requestAnimationFrame ( runFrame )
170
170
} else {
171
171
const now = performance . now ( )
172
+ const delta = now - lastFrameTime
173
+
174
+ lastFrameTime = now - ( delta % frameInterval )
175
+
172
176
tickerId = setTimeout (
173
- ( ) => runFrame ( now ) ,
174
- Math . max ( 0 , frameInterval - ( now - lastFrameTime ) ) ,
177
+ runFrame ,
178
+ Math . max ( 0 , frameInterval - delta ) ,
175
179
) as unknown as number
176
180
}
177
181
}
@@ -190,20 +194,28 @@ export function createFrame<T extends string = PhaseIDs>(
190
194
}
191
195
}
192
196
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
+
195
201
shouldRunTicker = loops . size > 0
196
202
197
203
if ( fps ) {
198
204
const delta = time - lastFrameTime
199
205
if ( delta < frameInterval ) {
200
- runTicker ( )
206
+ if ( ! isPaused ) runTicker ( )
201
207
return
202
208
}
203
209
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
204
217
}
205
218
206
- state . delta = useFrameInterval ? frameInterval : time - state . timestamp
207
219
state . timestamp = time
208
220
state . isPaused = isPaused
209
221
@@ -213,10 +225,8 @@ export function createFrame<T extends string = PhaseIDs>(
213
225
214
226
state . isRunning = false
215
227
216
- if ( shouldRunTicker && ! isPaused ) {
217
- useFrameInterval = false
218
- runTicker ( )
219
- } else cancelTicker ( )
228
+ if ( shouldRunTicker && ! isPaused ) runTicker ( )
229
+ else cancelTicker ( )
220
230
}
221
231
222
232
const frame : Frame < T > = {
@@ -261,7 +271,7 @@ export function createFrame<T extends string = PhaseIDs>(
261
271
options : PhaseScheduleOptions = { } ,
262
272
) => {
263
273
if ( ! shouldRunTicker ) {
264
- useFrameInterval = true
274
+ shouldRunTicker = true
265
275
lastFrameTime = performance . now ( )
266
276
runTicker ( )
267
277
}
0 commit comments