【入門編】 オフスクリーンキャンバスによる描画最適化 – Webブラウザの仕組み実践ガイド

ブラウザという魔法の箱の中で、なぜ時々「画面がカクつく」のか。今日はその正体を解き明かし、プロの現場でも愛用される「魔法の逃げ道」についてお話ししましょう。

—

画面がカクつく「主役」の悲劇

Webページを読み込むとき、ブラウザの中では「メインスレッド」という名の、たった一人の超優秀な指揮官がすべてを仕切っています。

  • HTMLの解析(間取り図を描く)
  • CSSの計算(壁紙や家具の色を決める)
  • JavaScriptの実行(動く仕掛けを動かす)

この指揮官、実は「一度に一つのことしかできない」という大きな弱点があります。例えば、複雑なアニメーションを描画している最中に重い計算処理が割り込むと、指揮官はパニックを起こします。「あ、今計算中だからちょっと待って!」と描画が止まり、結果としてユーザーの目には「カクつき」として映るわけです。

いわば、「電話でおしゃべりしながら、同時に料理もして、さらに家計簿までつけている」状態。そりゃあ、手元も狂いますよね。

救世主「OffscreenCanvas」の登場

この状況を打破するのが、今回紹介する「OffscreenCanvas(オフスクリーン・キャンバス)」です。

これは一言で言うと、「描画専用の『別室(ワーカースレッド)』を用意する」という技術です。メインスレッドという忙しいリビングから離れ、別の部屋で黙々と絵を描いてもらうイメージですね。

これを使えば、メインスレッドがどんなに忙しくても、アニメーションは別の部屋でスイスイと動き続けます。ユーザーには「ヌルヌル動く快適なサイト」として届くわけです。

どうやって実現するの?

難しいことは考えず、まずは「メインから切り離す」という手続きを覚えましょう。

1. メインスレッド: 「Canvas、君はもうこっちの部屋じゃなくて、向こう(ワーカースレッド)で働いてくれ!」と伝える。
2. ワーカースレッド: 「了解! じゃあ今からここで絵を描くよ」と受け取る。

これだけで、描画という重労働がメインから解放されます。

—

実践!コードで見てみよう

まずは、この「別室」を作るためのシンプルなコードを見てみましょう。

1. メインのファイル(main.js)

ここでは、Canvas要素を「転送」する手続きだけを行います。

// キャンバス要素を取得
const canvas = document.getElementById(‘myCanvas’);

// transferControlToOffscreen() でキャンバスの主導権を別室に渡す!
// これ以降、メインスレッドでこのcanvasに対して描画はできません(それが安全の証!)
const offscreen = canvas.transferControlToOffscreen();

// Web Worker(別室)を起動して、そのキャンバスを渡す
const worker = new Worker(‘worker.js’);
worker.postMessage({ canvas: offscreen }, [offscreen]);

2. 別室のファイル(worker.js)

ここでは、ひたすら描画だけに集中します。

// メインから送られてきたキャンバスを受け取る
self.onmessage = (e) => {
const { canvas } = e.data;
const ctx = canvas.getContext(‘2d’);

// アニメーションループ
function draw() {
// 画面をクリアして描画するだけの集中作業
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = ‘skyblue’;
ctx.fillRect(Math.random() 100, 50, 50, 50);

requestAnimationFrame(draw);
}
draw();
};

—

大丈夫、つまずいても怖くない

初めてこれを実装すると、「あれ? 画面が真っ白だ!」と焦ることがあります。でも安心してください。それは「メインスレッドで描画しようとして、実は主導権がすでにワーカースレッドに移っている」という、よくあるミスです。

プロの現場でも、最初は「あれ、描画命令が届いてないぞ?」なんてことは日常茶飯事。そんな時は、コンソールを見て「今、誰がキャンバスを握っているか」を確認する癖をつけるだけで、解決への近道になります。

この技術がもたらす未来

OffscreenCanvasを使いこなせるようになると、これまで「重すぎて無理」と諦めていたリッチな表現(複雑なデータ可視化や、ゲームのような動き)が、スマホのブラウザでもサクサク動くようになります。

指揮官(メインスレッド)を楽にしてあげること。それが、最高のユーザー体験を作るための「優しさ」であり、フロントエンド・エンジニアの腕の見せ所です。

まずは小さな四角形を一つ、別室で動かすところから始めてみませんか? きっと、ブラウザの向こう側に新しい世界が見えてくるはずですよ!

コメント

タイトルとURLをコピーしました