2013-02-26 2 views
0

Я разрабатываю игру с использованием холста HTML5, поэтому у меня есть игровой цикл, который я вызываю с помощью requestAnimationFrame. Когда я использую Chrome или IE, он работает нормально, устойчивый 60 кадров в секунду и плавный, как следует. Проблемы запускаются, когда я запускаю его в Firefox. Счетчик FPS превышает 60 кадров в секунду (он составляет около 65-70), и опыт игры не кажется гладким. Если он на самом деле работает более 60 кадров в секунду, я полагаю, что могу потерять некоторые фреймы. это код, который я использую для игрового цикла:Firefox 19: Исправлена ​​частота кадров с использованием шаблона requestAnimationFrame и HTML5. FPS более 60

window.requestAnimFrame = (function() { 
    return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || 
    function(callback) { 
     window.setTimeout(callback, 1000/60); 
    }; 
})(); 

    gameloop=function(){ 
     //Here I do my calculations and drawings 

     //I do this to calculate FPS 
     thisLoop=new Date; 
     var fps=1000/(thisLoop-lastLoop); 
     lastLoop=thisLoop; 

     requestAnimFrame(gameloop()); 
    } 

У вас есть объяснение? Это может быть даже нормально, но я играю в другие игры, и они, похоже, вообще не ведут себя так, как в Firefox.

Я попытался это решение:

http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating

, но конечный результат будет таким же.

ответ

0
requestAnimationFrame(gameloop()); 

Это правильно? Это означало бы, что вы вызываете игровой цикл из себя и ожидаете его завершения (что никогда не произойдет) перед передачей его возвращаемого значения (null) в requestAnimationFrame. Ваша игра будет работать как можно быстрее и никогда не поддаваться пользовательскому интерфейсу.

+0

Я только что отредактировал его. Где сказано: requestAnimationFrame (gameloop()); это вызов вызываемой функции: requestAnimFrame (gameloop()); – 2013-02-27 00:51:39

+0

Да, я называю игровой цикл от себя. Это должно быть хорошо, пока все используют его. – 2013-02-27 00:59:44

+0

'requestAnimationFrame' принимает функцию, которая будет называться _later_. вы вызываете функцию (сразу), а не передаете ее. попробуйте удалить круглые скобки. – Eevee

0

requestAnimFrame(gameloop());

Вот ваша ошибка, это не обратный вызов, вы просто вызов метода напрямую.

requestAnimFrame(gameloop);

Это посылает RAF фактическую функцию gameloop для вызова.