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年ぶりに読み返したが、今なおハッとさせられることが多く見つかる。 この本で忘れないようにしたい項目をピックアップするだけでも役に立ちそ・・・
この記事では、以前に読んだ際に付箋を付けていたが、その部分だけを備忘録としてピックアップするため、本の要約ではない。実際は、何倍も濃い内容で、練・・・
もう一回、全部読み返したいところだが、書籍がありすぎるので、当時付箋紙をつけていたところだけをピックアップ。書籍内ではより具体的な説明があるので・・・
これまでに扱ったことのないようなものを取り扱うときには、次のような問いを参考にすると何をしたらよいかが分かってくる。 どの部分が可動部で、どの部分が固定部か。・・・
以前に書いた「このサイトのリニューアル」で、リニューアル意思を示しつつも結局保留にして、先送りしてしまっていたけど、このあいだの週末(2013.3.29-30)・・・
エラーが起こっても大丈夫なシステムを作ると、みんなそれに頼るようになるので、信頼性を高くしておいたほうがよいだろう。 エラーの原因を理解し、その原因が最も少な・・・
こんな製品は使いたくない例1 教示がよくない。 システムの操作が可視的でない。 操作した結果が目に見えない。 こんな製品は使いたくない例2 デザイナーは良か・・・
新規コンテンツ「たびのと言ノ葉」公開 Webマガジン「たびのと」を夏に公開しましたが、たびのとのコンテンツの一つとして「たびのと言ノ葉(ことのば)」を新規で作・・・
いつもは直接アップロードしているので気にしていなかったが、WordPress管理画面のメニュー「メディア」からfavicon.icoをアップロードしようとした・・・
「デザインノート EXTRA good design company 水野学」から抜粋して自分なりの解釈を追加した過去メモ。 「iD」メイキング ・・・
外界の中の知識 人は環境を構造化して、思い出さなくてはならないものに関する多量の情報を手に入れることができるようにしている。 そのために、「ofの知識(事実につ・・・
もはや他ブラウザでも問題ないようにクロスブラザ対応だけでなく、スマートフォンやタブレット端末などマルチデバイスに対応できるようになっておかなければ、という時代に・・・
いろいろ調べると、疑似クラス「:placeholder」と「:placeholder-shown」というのにいきつく。 ちょっとハマってしまったので備忘録。ハマ・・・
「test」
「>ころころさん コメントありがとうございます! 確かに、APIドキュメント見ましたが、ライブに関する情報は今のところ取得できないようですね。 インスタライ・・・」
「SIGMAから超軽量で明るい単焦点レンズが2本発売になりましたので、リストにレンズ情報追加しました!」
「>名無しさん ご指摘、ありがとうございます! 記事冒頭の「まずはサンプル」のサンプルが動いていませんでしたので修正しました。」
「>前田さん コメントありがとうございます。 環境は分かりかねますが、修正したいファイルのパーミッションを604や644に変更すると書き込みできるようになります(・・・」
「アバターを取得する「get_avatar」についても追記しました!」
「「値をクリアする」を追加しました。チェックボックスやラジオボタンの値を何も選択していない状態に戻すときについて触れています。」
「>匿名さん コメントありがとうございます。 サンプルでは、beforeは何も処理していないので期待する表示にならない、で正解です。 クリックした後が、対応・・・」
「(匿名)さん コメントありがとうございます。何も設定変更していないのに、それまで使用できていたサーバーが突然使えなくなるのは辛いですよね、、。 ここで紹介したや・・・」
「コメントありがとうございます! そもそもできるかはわかりませんが、ソースを書き換える必要はあります。 下記記事などが参考になるかもしれません。 illustra・・・」
WEB制作マークアップJavaScriptsetTimeout は requestAnimationFrame に変えるべき? | シンプルシンプルデザイン