requestAnimationFrame < よーしおまえらー、アニメーションにsetInterval使うなよー
より適切なものが追加されたのでそっちを使いましょう。
setInterval/setTimeout → requestAnimationFrame;
これまでは setInterval
function render(){ // アニメーション 1フレーム分の処理 } setInterval(render, 1000 / 60);
これはもう古い。
これからは requestAnimationFrame
function animationLoop(){ render(); requestAnimationFrame(animationLoop); } animationLoop();
こうすべし。
requestAnimationFrameにすると何がいいの?
requestAnimationFrameなんてオブジェクトねーよ!だまされた!
まだベンダプレフィックスが付いてたりします。
// 各ブラウザ対応 window.requestAnimationFrame = (function(){ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback, element){ window.setTimeout(callback, 1000 / 60); }; })();
サンプル
requestAnimationFrame - jsdo.it - share JavaScript, HTML5 and CSS
参考:http://paulirish.com/2011/requestanimationframe-for-smart-animating/
追記 (2011/05/27)
使いましょうと言っといてあれですが
requestAnimationFrameは、Non-standardであり、実験的な機能であり、仕様は流動的です。
もともとの@paul_irishのコードではplyfill*1に別の名前が使われています。
I am using 'requestAnimFrame` here because since the spec is still in flux, I don't want to make a straight polyfill, yet.
'requestAnimFrame'という名前を使ってるけど、仕様が依然流動的だから、まだストレートなpolyfillは作りたくないんだ。
実際、特徴としてあげた点の一部をとっても各ブラウザの実装はばらばらです
- タブが非表示になったら描写が止まる
- Chrome12 止まる、
というかsetTimeoutでも止まる← コメントで指摘してもらいました「setTimeoutもタブがおもてにあるときは5msぐらいでも裏にあるときはかなり長く(ブラウザによっては1s)になったはず」。確かに止まってはいなくてゆーっくり進んでました>< - Firefox4 止まる
- Safari5 止まらない
- Chrome12 止まる、
- 60fpsに近い同期的な描写
- Chrome12 ○
- Firefox4 ×
- Safari5 ×
それでも使えるところから使っていきましょう
特にゲーム系のプログラムには重要なものだと思うのでいっぱい使ってフィードバックしたいところ。
ゲームとrequestAnimationFrameについてはこちらの記事が面白かったです。
JavaScript でゲームループを作る (The Game Loop) - t100のプログラミング脱出作戦