Sur mon application, j'ai un canevas dont la taille CSS (CSS, pas html) est mise à jour en fonction de la taille de la fenêtre.
J'ai une boucle principale de gameplay qui ressemble à ceci :
run = function(){
console.log(timerDiff(frameTime));
game.inputManage();
game.logics();
game.graphics.animate();
game.graphics.render();
frameTime = timerInit();
requestAnimFrame(run);
}
Ma fonction requestAnimFrame est celle de Paul Irish :
window.requestAnimFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function( callback ){
window.setTimeout(callback, 1000 / 60);
};
})();
En gros, le problème est que le timer que j'enregistre et qui mesure le temps écoulé entre l'appel à requestAnimFrame et l'appel à la fonction effective change du tout au tout. Si mon navigateur est en plein écran, j'obtiens 50/60 ms, et si j'ai une petite fenêtre, je peux atteindre quelque chose comme 10 ms.
Comme l'appel à requestAnimFrame est supposé appeler constamment la fonction sous un rythme de 60fps (ce qui est quelque chose comme 30 ms je pense) je ne devrais pas avoir ce genre de résultat, puisqu'il n'y a pratiquement rien qui se passe entre la création du timer et sa vérification, à part l'appel à requestAnimFrame
J'ai également des micro-gels récurrents (moins d'une seconde) qui se produisent toutes les 2/3 secondes. Mais le timer ne détecte aucun changement dans le temps (comme si le compteur de temps de javascript était bloqué).
Les fonctions de mes minuteries sont les suivantes, mais cela n'a pas vraiment d'importance ici
timerInit = function()
{
return new Date();
}
timerDiff = function(datePrev)
{
return new Date().getTime() - datePrev.getTime();
}