Há muitas coisas legais em torno da tela HTML5, requestAnimationFrame e fazendo animações com Javascript.
Se puder, você também deve verificar as animações CSS se quiser animar elementos DOM.
Para coisas mais avançadas, você pode querer usar um canvas, que geralmente é acelerado por GPU e permite taxas de quadros bastante altas e estáveis window.requestAnimationFrame
.
Se você precisar de buffer duplo na tela, uma das maneiras populares é criar um segundo elemento da tela e desenhar naquele e, em seguida, desenhar a imagem completa na tela principal usando drawImage, resultando em algo assim:
var primaryCtx = document.getElementById("canvas").getContext("2d");
var secondaryCanvas = document.createElement("canvas"),
secondaryCtx = secondaryCanvas.getContext("2d");
(function drawFrame() {
requestAnimationFrame(drawFrame);
secondaryCtx.fillStyle = "#f00";
secondaryCtx.fillRect(10,10,20,20);
primaryCtx.drawImage(secondaryCanvas);
})();
que nunca pareceu muito certo.
Entre ctx.save()
ectx.restore()
hoje descobri que há uma maneira que parece mais limpa e tem um desempenho tão bom quanto o método acima:
(function drawFrame() {
requestAnimationFrame(drawFrame);
primaryCtx.save(); //Freeze redraw
primaryCtx.fillStyle = "#f00";
primaryCtx.fillRect(10,10,20,20);
primaryCtx.restore(); //And now do the redraw
})();
que, apesar dos nomes estranhos, apenas congela a renderização do contexto e então retoma a renderização depois de terminarmos de desenhar nele.