Why does if condition executes in this requestAnimationFrame code?

I’m currently watching tutorials to build projects as I’m still not in a phase where I can carve a project that I want all on my own.

Currently, working on a snake game.

let speed = 2;

let lastPaintTime = 0;

//Game functions

function main(ctime) {

window.requestAnimationFrame(main);

if ((ctime - lastPaintTime) / 1000 < 1 / speed) {

return;

}

lastPaintTime = ctime;

gameEngine();

}

//Main logic starts here

window.requestAnimationFrame(main);

My confusion:

“If condition” should never be checked on this code. Because:

  1. window.requestAnimationFrame(main): It calls main function.

  2. At the very first line of main function, it again calls main function. So the control should go to main function and forever it should keep calling itself.

  3. The if condition should never be checked.

But I asked chatGPT, and it says that if condition will be executed.

It says that it doesn’t immediately call the main function but schedule/queue it.

What’s this behavior called in Javascript language? Where can I read more about it. Is this common for every programming language?

Things I’ve read from chatGPT

requestAnimationFrame is a method that schedules a function to be called before the next repaint of the browser window. It does not immediately call the function, but rather adds it to a queue of functions to be called at a later time. This allows the browser to update the screen at a consistent frame rate, while also allowing other tasks to be performed in between frames.

Are you using the if code to keep your frame rate consistent? If so, my recent article that covers delta time may be helpful:

Regarding what is the underlying concept behind queuing calls, look up JavaScript Event Loop :grinning:

These two videos may be helpful:

thank you. I watched your video about requestAnimationFrame as well.

This figure from this blog helped me clear my concepts related to this.

Source: JavaScript Behind the Scenes: The Event Loop

  1. Initially, window.rAF is passed to call stack.

  2. By definition, rAF waits till next repaint of window which is 16ms for 60fps screen. It’s like setTimeOut but better.

  1. window.rAF() is executed, so it is removed from the call stack. Call stack is empty. Meanwhile at the same time, after 16ms has been passed, main() has been put into callback queue.

Now here is where the event loop comes in. The event loop is a continuous running process that constantly checks if the call stack is empty or not. If the call stack is empty, it will move the function from the callback queue into the call stack and it gets executed. So, main() gets executed.

  1. Again, it calls window.rAF(main).

window.rAF() has now executed.

  1. Now, the code under window.rAF() runs(the if condition and so on and so forth). After, 16ms, main() is passed to callback queue.

main() gets executed.

2 Likes

That is a great resource! Thanks for sharing :slight_smile: