SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ウェブの最新技術が魅せる「Firefoxの灯」

Canvas&Processing
~ ウェブの最新技術が魅せる「Firefoxの灯」(2)


  • X ポスト
  • このエントリーをはてなブックマークに追加

RequestAnimationFrameを使う

 かつて、アニメーションを伴った描画を行う際、setTimeoutやsetInterval関数を使って時間間隔をあけ、グラフィクスを更新していました。ところがこれらの関数は、ディスプレイのリフレッシュレートとは無関係に呼ばれるため、しばしば高負荷な状態となり、固まってしまうこともありました。こうした問題に対して、RequestAnimationFrameという解決策が提示されました。これは、リフレッシュレートをみながら最適なタイミングで描画処理を促すことができる方法です。この手法を用いるとCSS TransitionやSVG Animationなど、複数のアニメーションを動かす場合でも再描画タイミングが同期され、ずれるようなことが起こりにくくなります。

 また、タブが裏に回ったときやウィンドウが最小化状態のときのように、アニメーションを含むコンテンツが非表示の場合は、再描画が促されなくなることも大きなメリットです。FirefoxではmozRequestAnimationFrameというメソッドを呼ぶことで、指定したfunctionがアイドル状態になったときに呼ばれるようになります。同様のメソッドは、webkit系ブラウザ(Google Chrome、Safari)、Opera、IE10でも実装されています。なお、本修正をProcessing.jsに入れ込むことも可能で、ここで利用しているprocessing-1.2.3.jsは、すでにその修正が入っています。

 以下のコードは、オリジナルのprocessingの実装と、RequestAnimationFrameを使うように施した例の違いです。

オリジナル
var executeSketch = function(processing) {
  // Don't start until all specified images and fonts in the cache are preloaded
  if (!curSketch.imageCache.pending && curSketch.fonts.pending()) {
      //割愛
  } else {
    window.setTimeout(function() { executeSketch(processing); }, 10);
  }
};

// The parser adds custom methods to the processing context
// this renames p to processing so these methods will run
executeSketch(p);
RequestAnimationFrameを利用
//利用可能な RequestAnimationFrame を探す
var requestAnimationFrame = 
    window.mozRequestAnimationFrame || 
    window.webkitRequestAnimationFrame || 
    window.oRequestAnimationFrame ||
    window.msRequestAnimationFrame ||
    function(callback){
        //見つからなかったので、既存のやり方で
        window.setTimeout(callback, p.curMsPerFrame);
    };
var processing = p;
var executeSketch = function() {
    // Don't start until all specified images and fonts in the cache are preloaded
    if (!curSketch.imageCache.pending && curSketch.fonts.pending()) {
        //割愛
    } else {
        requestAnimationFrame(executeSketch);
    }
};
// 次のフレーム再描画まで待って関数を実行
requestAnimationFrame(executeSketch);

今回のまとめ

 今回は主にCanvas周りの描画に注目し、Canvasへの直接的な描画やProcessing.jsを利用した描画、アニメーションの作成方法やFlashとのコードの比較などを解説しました。例に挙げた通りCanvasによって自由な描画やアニメーションが作成が可能となったことに加え、ウェブ標準となったこともあり、今後益々利用されていくことが予想されます。

 次回は、CSSやSVG、Audio Data APIなどに触れたいと思います。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ウェブの最新技術が魅せる「Firefoxの灯」連載記事一覧

もっと読む

この記事の著者

赤塚 大典(アカツカ ダイスケ)

1976年東京生まれ。都立航空工業高等専門学校を卒業後、4輪レーサーを目指すも断念。蕎麦屋、溶接屋を経てプログラマになる。プログラマとしては、京阪奈地区の研究所に7年従事し、その間、2003年IPA未踏ユース、2006年IPA未踏ソフトウェア創造事業に採択される。未踏において、Firefoxの拡張機...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Mozilla Japan(Mozilla Japan)

一般社団法人 Mozilla Japanhttp://mozilla.jp/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6121 2011/09/06 13:16

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング