Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RangeError with requestAnimationFrame

I'm getting the following error:

RangeError: Maximum call stack size exceeded.

on this row:

requestAnimFrame(Game.loop());

in this piece code:

var Game = {
  canvas: null,
  context: null,
  targetFps: 60,

  init: function() {
    canvas = document.getElementById('main-canvas');
    context = canvas.getContext('2d');

    // Resize canvas to match content
    var content = document.getElementById('primary-content');
    canvas.width = content.offsetWidth;
    canvas.height = content.offsetHeight;

    window.requestAnimFrame = (function() {
      return window.requestAnimationFrame || // Chromium
        window.webkitRequestAnimationFrame || // WebKit
        window.mozRequestAnimationFrame || // Mozilla
        window.oRequestAnimationFrame || // Opera
        window.msRequestAnimationFrame || // IE
        null;
    })();

    this.loop();
  },

  loop: function() {
    requestAnimFrame(Game.loop());
  },

  update: function() {
    // ...
  },

  draw: function() {
    // Clear background with black
    context.fillStyle = '#000';
    context.fillRect(0, 0, canvas.width, canvas.height);
  }
};

Game.init();
<div id="primary-content">
  <canvas id="main-canvas" width="400" height="400"></canvas>
</div>

It's probably something obvious I'm overlooking, but any help would be appreciated. Thanks!

like image 286
jdlm Avatar asked Jan 07 '12 18:01

jdlm


People also ask

How do you control speed in requestAnimationFrame?

Method 1: Update data via setInterval, and graphics via RAF. Keep those values in an object for each animated element. Assign the transform string to a variable in the object each setInterval 'frame'. Keep these objects in an array. Set your interval to your desired fps in ms: ms=(1000/fps).

What is requestAnimationFrame?

requestAnimationFrame() method tells the browser that you wish to perform an animation and requests that the browser calls a specified function to update an animation before the next repaint. The method takes a callback as an argument to be invoked before the repaint.

Why is requestAnimationFrame better than setInterval?

Another reason requestAnimationFrame is so useful is the fact that it gives you a time variable which you can use to calculate the amount of time between frames. This is not something that setInterval will do and since setInterval is not 100% accurate it is very possible your animation will get messed up over time.

How do I slow down requestAnimationFrame?

If your animation requires a different frames per second (up to 60 fps) or simply doesn't require that high a level of refresh rate, you can slow it down by calling requestAnimationFrame inside setTimeout() .


1 Answers

You are calling the function right away instead of passing it:

loop: function() {
        requestAnimFrame(Game.loop());
    }

Will just keep doing Game.loop() over and over again.

What you want is:

loop: function() {
        requestAnimFrame(Game.loop);
    }

this will pass the function as an argument to requestAnimFrame, instead of calling Game.loop() and passing the result (undefined).

like image 100
Esailija Avatar answered Sep 21 '22 07:09

Esailija