requestAnimationFrame をはじめて見たので調べていたら、setTimeout や setInterval は requestAnimationFrame にするべき、のような記事タイトルが多かった。どういうことなのだろうと簡単な調査を行ったのでレビュー。
というわけで、この結論に至った経緯を紹介します。
簡易的な処理を書いて、10秒実行した結果、数字での違いははっきりあったものの、requestAnimationFrame のスゴさを体感できるほどの違いはなかった。そのため、あえて過去のソースを書き換えるほどではないと判断。
もしかすると電光掲示板のようなデザインであれば、なめらかさに違いが出るかもしれない(未検証)。
そもそも、requestAnimationFrame は何か。
ネット上の情報を見ると、一秒間におよそ60回、引数に渡した関数を反復処理する、とある(実際は30回の場合あり、後述)。つまり、1000/60ミリ秒ごとに処理を繰り返すということだ。実際には、一秒間の処理回数は60回と決まっているわけではなく、ブラウザに依存するとのこと。
つまり、requestAnimationFrame の場合、インターバル時間を指定できない。setTimeout や setInterval ではインターバル時間を任意に指定できる。
ソースで書くと似ていることが記法は似ていることがよくわかる。
const sample = () => {
setTimeout(sample, 1000/60);
}
const sample = () => {
window.requestAnimationFrame(sample);
}
同じネット回線で、10秒間計測して、その間に何回処理をするのか計測してみた。
テストしたコードはこちら。
https://sample.simplesimplesdesign.com/requestAnimationFrame/
1秒間に60回処理を実行する想定だから、10秒間では「600」が期待値だ。
| requestAnimationFrame | setTimeout | |
|---|---|---|
| macOS12/Chrome92 | 298 | 556 |
| iOS14/Safari14 | 602 | 579 |
驚きなのは、macOS12/Chrome92 で、requestAnimationFrameの値が298と期待値の半分であること。1分間に30回の処理という計算になる。
そこで、setTimeout(sample, 1000/30); として測定したところ、287 が返ってきた。requestAnimationFrame の1秒間に30回処理としたら、 requestAnimationFrame は setTimeout より処理回数が理論値に近い(=より正確)ことが分かる。
ちなみに、実装レベルでは setTimeout を利用するときには、clearTimeout を併用するが、requestAnimationFrame を利用する場合にも、その処理を途中でキャンセルするメソッドが用意されている。それが、cancelAnimationFrame だ。
使い方はclearTimeoutと同様。
ググった情報は、requestAnimationFrameをプリフィックス付きで判別する古い記事が多い。
だがしかし、現状では、よっぽど古いブラウザのケアが必要なければプリフィックス判別はもういらない。
この書籍の中で、ライティングのユーザビリティについて触れている項目があり、激しく共感する部分だったので、ここで備忘録としてピックアップする。 ・・・
この書籍は、I部 リサーチ、II部 デザイン、III部 インプリメンテーションと三部構成になっている。この記事では、その中から、I部 リサーチ、・・・
これを知ったときはマジか!と飛び跳ねた。あらためて思い返してみると、確かに公式チュートリアルでも触れていたことをうっすら思い出す。そしてそのときとやり方がなん・・・
試したことはまだないけど、Macで編集時と書き出し後で色味が変わって困ったときのために備忘録。 プロジェクト設定 > 「カラーマネジメント・・・
プロジェクト設定と環境設定について詳しく解説されている情報がなかなか見つからないので、要所要所で知り得た情報を更新していきます。 プロジェクト設定 ・・・
Clipyが超絶便利そうだったので、macOS Big Sur にインストール&再起動して使ってみた。ところが、command + c を複数の箇所で行い、c・・・
requestAnimationFrame をはじめて見たので調べていたら、setTimeout や setInterval は requestAnimati・・・
6年ぶりに読み返したが、今なおハッとさせられることが多く見つかる。 この本で忘れないようにしたい項目をピックアップするだけでも役に立ちそ・・・
この記事では、以前に読んだ際に付箋を付けていたが、その部分だけを備忘録としてピックアップするため、本の要約ではない。実際は、何倍も濃い内容で、練・・・
もう一回、全部読み返したいところだが、書籍がありすぎるので、当時付箋紙をつけていたところだけをピックアップ。書籍内ではより具体的な説明があるので・・・
忘れがちな気になる情報をストックしておきたい 普段、ラジオやテレビで知った気になる情報は一時間後には忘れてることがよくあって。映画館で映画を見た時も上映前の・・・
もう一回、全部読み返したいところだが、書籍がありすぎるので、当時付箋紙をつけていたところだけをピックアップ。書籍内ではより具体的な説明があるので・・・
6年ぶりに読み返したが、今なおハッとさせられることが多く見つかる。 この本で忘れないようにしたい項目をピックアップするだけでも役に立ちそ・・・
これを知ったときはマジか!と飛び跳ねた。あらためて思い返してみると、確かに公式チュートリアルでも触れていたことをうっすら思い出す。そしてそのときとやり方がなん・・・
「/」が意味するのは、どの階層にいようが一番上の階層を基準にすること。ナビゲーションが階層が変わった場合でもリンク先を変更する必要がないので便利。ただアップロー・・・
Web Designing 2011/3 パブリッシング プロジェクト06「新聞・メディア論」が気になったのでピックアップ。 メディアというのは、ちょっとしたき・・・
制作時の注意点 大きくても200×300(20文字×15行) 特殊文字の積極的利用 電話番号入力で直接電話をかけられる 文字入力ではなく、リストから選択できる・・・
地図サービス「ジョルノ地図」、リニューアルしました。 ジョルノ地図(公開終了) ゼロベースで企画からやり直しました。 まず、「どんなときに地図を使うのか」、改・・・
この記事では、以前に読んだ際に付箋を付けていたが、その部分だけを備忘録としてピックアップするため、本の要約ではない。実際は、何倍も濃い内容で、練・・・
正しいCSSを記述しているにもかかわらず、表示が崩れることがある。ブラウザによる解釈の違い(バグ)が原因であるが、IE5や古いブラウザにバグが見られる。・・・
「test」
「>ころころさん コメントありがとうございます! 確かに、APIドキュメント見ましたが、ライブに関する情報は今のところ取得できないようですね。 インスタライ・・・」
「SIGMAから超軽量で明るい単焦点レンズが2本発売になりましたので、リストにレンズ情報追加しました!」
「>名無しさん ご指摘、ありがとうございます! 記事冒頭の「まずはサンプル」のサンプルが動いていませんでしたので修正しました。」
「>前田さん コメントありがとうございます。 環境は分かりかねますが、修正したいファイルのパーミッションを604や644に変更すると書き込みできるようになります(・・・」
「アバターを取得する「get_avatar」についても追記しました!」
「「値をクリアする」を追加しました。チェックボックスやラジオボタンの値を何も選択していない状態に戻すときについて触れています。」
「>匿名さん コメントありがとうございます。 サンプルでは、beforeは何も処理していないので期待する表示にならない、で正解です。 クリックした後が、対応・・・」
「(匿名)さん コメントありがとうございます。何も設定変更していないのに、それまで使用できていたサーバーが突然使えなくなるのは辛いですよね、、。 ここで紹介したや・・・」
「コメントありがとうございます! そもそもできるかはわかりませんが、ソースを書き換える必要はあります。 下記記事などが参考になるかもしれません。 illustra・・・」
WEB制作マークアップJavaScriptsetTimeout は requestAnimationFrame に変えるべき? | シンプルシンプルデザイン