Skip to content

Timestep

The engine uses a semi-fixed timestep, with rendering done as quickly as possible (limited only by the requestAnimationFrame function) and updates delivered in a fixed way.

Game loop

The game loop exists in the Game class.

The game loop in this engine is built following the article 'Fix Your Timestep!' by Glenn Fiedler. The article sets out nicely a progression in game loops before concluding with a recommended game loop. To understand the gameloop better, read the article, but the key points of the approach JamJar uses are laid out here:

  • Rendering can occur as fast as possible.
  • Physics/Game calculations are uncoupled from this render/loop rate.
  • Physics/Game updates can catch up if running behind.
  • Physics/Game updates will slow down if ahead.

The basic algorithm that JamJar uses is:

timestep = 1/100
currentTime = 0
accumulator = 0

loop(timeSinceStart)
    frameTime = timeSinceStart - currentTime
    if frameTime > 0.25
        frameTime = 0.25

    currentTime = timeSinceStart
    accumulator += frameTime

    while accumulator >= timestep
        update(timestep)
        accumulator -= timestep

    alpha = accumulator / timestep

    render(alpha)

    requestLoop(loop)

loop(0)

Timestep

The timestep of JamJar is for an update to occur every 1/100th of a second.

Interpolation

Because of the game loop used JamJar must interpolate as part of the rendering process, this means taking the last rendered position of an object and the current position of the object and rendering at the halfway between these two positions.

See the Transform component and InterpolationSystem to see how this previous position is tracked and updated.

See the SpriteSystem to see how a pre-render system must use interpolation to prepare Renderable objects.

requestAnimationFrame

This function is the default method of queueing up loops, the callback rate for Chrome and Firefox is 60 frames per second. This function is also not called if the game tab is not active (user is in another tab).