なぜブラウザでドット絵を描くのか
かつて専用ソフトが必要だったドット絵制作。Web技術の進化が、その常識を変えました。そしてブラウザは今、あらゆるUIのプラットフォームになりつつあります。
この記事は、Pixnoteの根幹を支えるブラウザ技術について、かなり深掘りした読み物です。Canvas APIの内部構造からブラウザエンジンが自動車やゲームのUIに使われている話まで、読了に約30分ほどかかります。気になるセクションだけ拾い読みしてもらっても大丈夫です。
ブラウザベースの利点
Pixnoteがブラウザベースで動作する最大の理由は、「誰でも、どこでも、今すぐ始められる」環境を提供するためです。これは単なる利便性の話ではありません。ドット絵を描くという創作行為の敷居を、技術的な障壁からゼロにするためのアーキテクチャ上の設計判断です。
インストール不要
URLを開くだけ。ダウンロード・インストール・アップデートの手間がゼロ。思い立った瞬間に描き始められます。
どのデバイスでも
スマートフォン、タブレット、PC、Chromebook。OSを問わず、ブラウザがあれば同じ環境で制作できます。
プライバシー安全
描画処理はすべてあなたのブラウザ内で完結。画像データがサーバーに送信されることはありません。
常に最新版
ページを開くたびに自動で最新バージョン。アップデートの通知に煩わされることもありません。
ネイティブアプリには「インストールの壁」があります。アプリストアを開いて、検索して、ダウンロードして、インストールを待って、起動する。この一連のステップの中で、多くの人が離脱します。ブラウザベースなら、リンクをタップした次の瞬間にはもう描き始めています。この差は、ツールの性能差よりもずっと大きい。
昔と今 — 制作環境の変化
2000年代まで、ドット絵制作にはPCと専用ソフトウェアが必須でした。現在は状況が大きく変わっています。
以前の制作環境
- 専用ソフトをPCにインストール
- PCでのみ作業可能
- 有料ソフトが多い
- OS依存(WindowsのみやMacのみ)
- 手動でアップデート
- ファイルはローカルに保存
現在の制作環境(Pixnote)
- URLを開くだけで開始
- スマホ・タブレット・PCどこでも
- 完全無料
- OS不問(ブラウザがあればOK)
- 常に最新版を自動提供
- クラウド保存にも対応
ブラウザを変えたWeb技術の進化
10年前のブラウザでは、本格的な描画ツールの実現は困難でした。以下の技術の登場と成熟が、ブラウザをクリエイティブツールのプラットフォームへと変貌させました。ひとつずつ掘り下げていきましょう。
Canvas API
HTMLの<canvas>要素は、JavaScriptからピクセル単位で画面に描画できるAPIです。ドット絵ツールの核となる技術で、1ピクセルごとの描画、色の取得、画像のエクスポートをすべてブラウザ内で実現します。
Pixnoteのエディタは、このCanvas APIを使ってピクセルの配置・レイヤー合成・PNG出力を行っています。
Canvas API の内側 — ピクセル操作の仕組み
Canvas 2DコンテキストのgetImageData()は、指定領域のピクセルデータをImageDataオブジェクトとして返します。これは、各ピクセルのRGBA値が格納されたUint8ClampedArray(型付き配列)です。たとえば32x32のキャンバスなら、32 × 32 × 4 = 4,096バイトの配列になります。
const ctx = canvas.getContext('2d');
const imageData = ctx.getImageData(0, 0, 32, 32);
const data = imageData.data;
// ピクセル(x=10, y=5)のインデックスを計算
const index = (y * 32 + x) * 4;
const r = data[index]; // Red (0-255)
const g = data[index + 1]; // Green (0-255)
const b = data[index + 2]; // Blue (0-255)
const a = data[index + 3]; // Alpha (0-255)
この仕組みにより、C言語のようにメモリ上の画像バッファを直接操作できます。putImageData()で書き戻せば、数千ピクセルの一括変更もミリ秒単位で完了します。フィルター処理や色変換、レイヤー合成もすべてこのバイト配列操作で実現できるのです。
型付き配列(Typed Array)はJavaScriptの通常の配列と異なり、メモリ上に連続した領域を確保します。これにより、CPUのキャッシュ効率が劇的に向上し、大量のピクセル処理でもネイティブに近い速度が出ます。ブラウザの中でこのレベルの低レベル操作ができるようになったのは、HTML5以降の大きな進歩です。
レイヤー合成の仕組み
Pixnoteのマルチレイヤー機能は、各レイヤーのピクセルデータをメモリ上の配列として管理し、表示時に単一のCanvasへ合成出力する方式を採用しています。Editor Liteでは、各ピクセル位置について上位レイヤーから順にパレットインデックスの配列を走査し、最初に見つかった非透明ピクセルをImageDataに書き込みます。
この方式ではgetImageData()で取得したバイト配列に直接ピクセル値を書き込み、putImageData()で一括反映します。全ピクセルをループ処理するため一見非効率に思えますが、型付き配列のメモリ連続性とJITコンパイラの最適化により、数千ピクセル規模のドット絵キャンバスでは十分な速度で動作します。
WebGL / WebGL 2
WebGLは、ブラウザからGPU(グラフィックスプロセッサ)に直接アクセスするためのAPIです。OpenGL ES 2.0をベースにしており、3Dレンダリングだけでなく、大量のピクセル処理をGPUで並列実行するためにも使われます。
GPUは数千のコアを持ち、各コアが独立してピクセル計算を行います。たとえば128x128のキャンバスで全16,384ピクセルにフィルターをかける場合、CPUでは1ピクセルずつ順番に処理しますが、GPUなら全ピクセルを同時に処理できます。このパラダイムの違いが、リアルタイムエフェクトやプレビューを可能にしています。
Web Storage / IndexedDB
ブラウザにデータを保存する仕組みが整備されました。localStorage(キー・バリュー型、最大5-10MB)やIndexedDB(構造化データ向け、数百MB以上可能)により、作品データをローカルに保持できるようになりました。
IndexedDBはトランザクション処理をサポートしており、作品の保存中にブラウザがクラッシュしてもデータが破損しにくい設計になっています。また、非同期APIのため、大きなデータの読み書き中もUIがフリーズしません。
Touch Events / Pointer Events
スマートフォンやタブレットのタッチ操作をWebページで処理するAPIが標準化されました。マルチタッチ、ピンチズーム、スワイプといったジェスチャーがWebアプリでも使えるようになり、モバイルでの描画体験が現実的になりました。
特にPointer Eventsは画期的でした。マウス、タッチ、ペン入力をすべて同じAPIで統一的に扱えるため、開発者はデバイスごとに別のコードを書く必要がなくなりました。さらにpressureプロパティでペンの筆圧を取得でき、筆圧に応じた線の太さの変化も実現できます。
JavaScript エンジンの高速化
2008年のGoogle Chrome登場(V8エンジン)を皮切りに、ブラウザのJavaScript実行速度は劇的に向上しました。JIT(Just-In-Time)コンパイルの導入により、かつてはネイティブアプリでしか実現できなかった処理速度がブラウザ内で達成できるようになりました。
JITコンパイラの仕組み — なぜブラウザのJSは速くなったか
初期のJavaScriptエンジンはインタプリタ方式で、コードを1行ずつ読んで実行していました。V8エンジンは、実行中のコードを分析し、頻繁に実行される「ホットパス」をネイティブの機械語に直接コンパイルします。
現在のV8は多段階のパイプラインを持っています。まずIgnition(インタプリタ)がバイトコードを素早く実行し、その間にプロファイリングデータを収集します。十分なデータが集まると、TurboFan(最適化コンパイラ)が高度に最適化された機械語を生成します。
この仕組みにより、ドット絵エディタの描画ループのように繰り返し実行されるコードは、事実上ネイティブコンパイルされたプログラムと同等の速度で動作します。「JavaScriptは遅い」というのは、もはや2000年代の話です。
| エンジン | ブラウザ | 最適化コンパイラ |
|---|---|---|
| V8 | Chrome, Edge, Opera | TurboFan + Maglev |
| SpiderMonkey | Firefox | WarpMonkey |
| JavaScriptCore | Safari | FTL (Faster Than Light) |
3大エンジンはすべて多段階JITを採用しており、激しい性能競争(「ブラウザ戦争」の技術面)を続けています。この競争こそが、Webアプリの性能を年々向上させている原動力です。
WebAssembly (Wasm)
WebAssemblyは、ブラウザ上でネイティブに近い速度でコードを実行するためのバイナリフォーマットです。C、C++、Rustなどの言語で書かれたプログラムをコンパイルして、ブラウザ内で実行できます。
デザインツールのFigmaは、C++で書かれたレンダリングエンジンをWebAssemblyにコンパイルし、ブラウザ上で動作させています。PhotopeaはPhotoshopの主要機能をブラウザ内で再現し、レイヤーやフィルターを含む高度な画像編集を可能にしています。「ブラウザでは重い処理は無理」という固定観念は、WebAssemblyによって完全に覆されました。
OffscreenCanvas / Web Workers
OffscreenCanvasは、メインスレッド(UIスレッド)以外のバックグラウンドスレッドでCanvas描画を行うためのAPIです。重い描画処理をWeb Worker内で実行し、UIの応答性を維持したまま複雑なレンダリングを行えます。
これは、メインスレッドがUIイベントの処理に専念し、描画計算をワーカースレッドに委譲するマルチスレッドアーキテクチャです。ネイティブのデスクトップアプリケーションで当たり前だった手法が、ようやくブラウザでも実現できるようになりました。
Service Worker / PWA
Service Workerは、ブラウザとネットワークの間に入るプロキシのような存在です。ネットワークリクエストをインターセプトし、キャッシュから応答を返すことで、オフラインでもWebアプリを動作させます。
PWA(Progressive Web App)は、このService Workerとマニフェストファイルを組み合わせた技術です。ホーム画面に追加すると、アドレスバーのないフルスクリーンで起動し、通知も受け取れます。ユーザーから見れば、ネイティブアプリとほぼ区別がつきません。
ある調査では、PWAはネイティブアプリと比較して「ダウンロードサイズが平均1/50」「インストール率が3倍」という結果が出ています。「ブラウザアプリ=ネット接続必須」という時代は完全に終わりました。
File System Access API
ブラウザアプリの大きな弱点だった「ローカルファイルへの直接アクセス」を可能にするAPIです。ユーザーの許可のもと、ファイルの読み書きを行えます。「名前を付けて保存」のダイアログを出してPNGファイルを直接保存したり、既存のファイルを上書き保存したりといった、デスクトップアプリと同じワークフローが実現できます。
ブラウザ性能の進化
JavaScript実行速度を基準にした、ブラウザ性能の進化を示します。2008年のChrome登場を境に、ブラウザの処理能力は飛躍的に向上しました。
※ 2005年比の概算値。ベンチマーク・環境により異なります。
Pixnoteが2018年にサービスを開始できたのは、ちょうどこの頃にブラウザ性能が実用的なクリエイティブツールを支えられる水準に達していたからです。
「ブラウザ戦争」がもたらした恩恵
2008年以降、Chrome(V8)、Firefox(SpiderMonkey)、Safari(JavaScriptCore)の3大エンジンは激しい性能競争を繰り広げてきました。あるエンジンが新しい最適化手法を導入すると、他のエンジンも追随します。この競争は、Web開発者やユーザーにとって大きな恩恵をもたらしました。
Hidden Classes(オブジェクトの形状に基づく最適化)、Inline Caching(プロパティアクセスの高速化)、Escape Analysis(不要なメモリ割り当ての排除)など、各エンジンは最先端のコンパイラ技術を投入しています。これらの技術は学術研究レベルのものであり、世界最高峰のエンジニアが無料のブラウザのために最適化を続けているのは、人類のソフトウェア史上でも特筆すべきことです。
ブラウザで動く本格ツールたち
Pixnoteだけではありません。現在、多くの本格的なクリエイティブ・生産性ツールがブラウザ上で動作しています。かつて「ブラウザでは無理」と思われていた領域が、次々と開拓されています。
Figma
UIデザインツールの世界標準。C++レンダリングエンジンをWebAssemblyにコンパイルし、WebGLでGPU描画。2016年のリリース以来、デスクトップアプリの市場をブラウザから奪取した象徴的な事例。
Photopea
Photoshopの主要機能をブラウザで再現。PSD、XCF、Sketch形式を直接開ける。1人の開発者が作り上げた驚異のプロジェクト。月間数百万ユーザーが利用。
VS Code for the Web
Microsoftの人気コードエディタがブラウザで動作。vscode.devにアクセスするだけで、GitHubリポジトリを直接編集できる。拡張機能もWebWorker上で動作。
Spline / Three.js
WebGLベースの3Dデザインツール。ブラウザ上で3Dモデルの作成・アニメーション・レンダリングを実行。リアルタイムのコラボレーション機能も。
Soundtrap / Bandlab
Web Audio APIを使ったブラウザベースのDAW(デジタルオーディオワークステーション)。マルチトラック録音、MIDIエディタ、エフェクト処理をすべてブラウザ内で実行。
Onshape
フル機能のCADツールがブラウザで動作。3D CADはデスクトップアプリの最後の砦と思われていた分野。クラウドベースのリアルタイム共同設計を実現。
これらの事例が示しているのは、「ブラウザはWebサイトを見るためのもの」という認識がもはや完全に過去のものだということです。ブラウザは今、最も普及したアプリケーションプラットフォームです。
ブラウザエンジン — あらゆるUIの基盤へ
ここからはさらに深い話です。ブラウザの技術は、Webブラウザの中だけで使われているわけではありません。ブラウザのレンダリングエンジン(HTML/CSS/JSを解釈して画面に描画する仕組み)は、今やあらゆるアプリケーションのUI表示に使われています。
デスクトップアプリ — Electron革命
Electronは、ChromiumブラウザエンジンとNode.jsランタイムを組み合わせたフレームワークです。Web技術(HTML/CSS/JavaScript)でデスクトップアプリケーションを構築できます。あなたが普段使っているアプリの多くが、実はブラウザエンジンで動いています。
- Visual Studio Code — 世界で最も使われているコードエディタ
- Slack — ビジネスチャットのデファクトスタンダード
- Discord — ゲーマー・コミュニティの中心的プラットフォーム
- Spotify(デスクトップ版) — 音楽ストリーミングのUI
- Figma(デスクトップ版) — ブラウザ版と同一エンジン
- Notion — ドキュメント・プロジェクト管理
- 1Password — パスワード管理ツール
これほど多くのアプリがElectronを採用しているのは、Web技術のUI表現力がネイティブに匹敵するレベルに達しているからです。CSS Grid、Flexbox、カスタムプロパティ、アニメーション…これらを組み合わせれば、あらゆるUIデザインを実現できます。
軽量ブラウザエンジン — Electronの先へ
Electronは優れたフレームワークですが、Chromiumを丸ごと同梱するため、アプリのサイズが大きくなります(最小でも約100MB〜)。この課題に対して、より軽量なアプローチが登場しています。
| 技術 | アプローチ | 特徴 |
|---|---|---|
| Tauri | OS標準のWebView + Rust | アプリサイズ約2-5MB。セキュリティ重視。 |
| WebView2 | Windows標準のEdge WebView | Microsoftが提供。OSに組み込み済み。 |
| Wry | Tauriの低レベルWebViewライブラリ | 各OSのWebViewを統一的に操作。 |
| Ultralight | 軽量HTMLレンダラー | ゲームUI向け。GPUアクセラレーション対応。 |
| Sciter | 独自の軽量HTMLエンジン | わずか5MBのランタイム。組込み向け。 |
| Servo | Rust製の次世代エンジン | Mozillaが開発。並列レンダリング。 |
特にTauriは注目に値します。OS標準のWebView(macOSならWebKit、WindowsならEdge/WebView2、LinuxならWebKitGTK)を活用するため、ブラウザエンジンをアプリに同梱する必要がありません。結果として、Electronの1/50以下のサイズでデスクトップアプリを配布できます。これは「ブラウザ技術でUIを描く」というアプローチが、もはやOSレベルで標準インフラとして組み込まれていることを意味しています。
Webの外へ広がるブラウザエンジン
ブラウザエンジンの活用は、デスクトップアプリだけにとどまりません。驚くほど多くの場面で、HTMLとCSSがUI表示に使われています。
ゲーム内UI
一番Webと遠そうなのに、実は最も積極的にブラウザエンジンを採用しているのがゲーム業界です。かつてはC++でUIを独自に組んでいましたが、現在では多くのAAA(超大作)タイトルで、HTML/CSS/JavaScriptがUI構築に使われています。『Microsoft Flight Simulator』や『PUBG』のメニュー画面・HUDは、Coherent GameFaceを使ったHTMLベース。CSSのFlexboxやアニメーションでUIを作ってゲームエンジンに流し込む方が、C++で同じことをやるより圧倒的に早くリッチなUIが作れるのです。UnityやUnreal Engineとの統合も進んでいます。
車載インフォテインメント
テスラの車載ディスプレイはChromiumベース。他の自動車メーカーもQt WebEngine(Chromium派生)やWebKitベースのシステムを採用。地図表示、音楽プレーヤー、車両設定などのUIがHTML/CSS/JSで構築されています。
スマートTV
LGのテレビに搭載されている「webOS」は、文字通りWeb技術ベースのOS(元々はPalm/HPがスマートフォン向けに開発したもの)。SamsungのTizenOSもHTML5ベースのアプリ基盤を採用しています。Netflix、YouTube、Amazon Prime VideoのTV版アプリは、基本的にブラウザ上に全画面でUIを表示している状態です。つまりあなたがテレビで見ている画面の大半は、ブラウザエンジンが描画しています。1つのWebプログラムを書くだけで、ソニーでもパナソニックでもLGでもSamsungでも動く — これがWeb技術の圧倒的な汎用性です。
キオスク・サイネージ
空港の案内端末、コンビニのマルチメディア端末、駅のデジタルサイネージ。多くがChromium/WebKitベースのシステムで動作しています。HTMLならリモートでコンテンツを更新でき、運用コストが劇的に下がります。
Steam / Epic Games
PCゲーマーなら誰もが使うSteam。あのアプリのストア画面だけでなく、ライブラリ画面もコミュニティも、すべてCEF(Chromium Embedded Framework)で描画されています。実はSteamの設定をいじると、Chromeの開発者ツール(F12で出てくるあの画面)を表示することすらできます — まさにChromiumそのものです。Epic Games LauncherもChromiumベース。
WebView アプリ
iOS(WKWebView)、Android(Android WebView)は、OSレベルでブラウザエンジンをアプリに組み込む機能を提供。ハイブリッドアプリ(Ionic、Capacitor)はこれを活用し、1つのコードベースでiOS/Android/Webの3プラットフォームに対応しています。
なぜこれほどブラウザエンジンが広まったのか?理由はシンプルです。人類が作ったUI構築システムの中で、HTML/CSSが歴史上ダントツで最も成熟しており、それを扱える開発者が世界中に何百万人もいるからです。アプリごとに独自のUI構築システムをゼロから開発するのは莫大なコストがかかります。それなら、GoogleやApple、Mozillaが何十年もかけ、何千億円もの投資で改良し続けてきた「最強の画面描画エンジン」を部品として借りてきて、そこにUIを描かせた方が合理的で、品質も高くなるのです。
参考リンク
- ゲームUI: Coherent GameFace 公式サイト(採用タイトル一覧あり)
- ゲーム配信: Chromium Embedded Framework - Wikipedia
- 自動車: Tesla のChromium採用について - Electrek
- スマートTV: LG webOS TV 開発者ポータル
- スマートTV: Samsung Tizen 開発者ガイド
Pixnoteを支える技術
Pixnoteは以下のWeb標準技術を組み合わせて構築されています。すべて主要ブラウザで標準サポートされている技術です。特別なプラグインは一切不要です。
PNG出力の裏側
ドット絵をPNGとしてダウンロードする処理も、すべてブラウザ内で完結しています。canvas.toBlob()メソッドがCanvas上のピクセルデータをPNG形式にエンコードし、URL.createObjectURL()でダウンロード可能なURLを生成します。サーバーサイドの処理は一切介在しません。
canvas.toBlob(function(blob) {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'my-pixel-art.png';
a.click();
URL.revokeObjectURL(url);
}, 'image/png');
PNG出力の処理にサーバー通信は一切発生しません。クラウド保存機能を使わない限り、作品データがネットワーク上を流れることはありません。描画もエクスポートもローカルで完結するため、意図しないデータ送信のリスクがないのです。
画像データとの戦い — Pixnoteの最適化哲学
ここまでWeb技術の話をしてきましたが、ブラウザで「使いもの」になるツールを作るには、技術を知っているだけでは足りません。ドット絵エディタが扱うのは画像データです。テキストとは桁違いにデータ量が大きい。この現実に正面から向き合い、メモリ・CPU・GPUを無駄に消費しない — それがPixnoteの開発における一貫したコンセプトです。
ユーザーのデバイスのリソースは、Pixnoteだけのものではありません。ブラウザには他のタブもあり、OSには他のアプリもあります。使えるリソースを際限なく使い尽くすのではなく、最小限のリソースで最大限の体験を実現する。ここではその工夫の一部をご紹介します。
画像データはなぜ重いのか
この記事のHTMLテキスト全体は、圧縮前でもせいぜい数十KBです。一方、たった32×32ピクセルの画像でも、RGBA形式では 32 × 32 × 4バイト = 4,096バイト(4KB)。レイヤーが4枚あれば16KB。それにUndo履歴を50ステップ分保持すると、この小さなキャンバスだけで 数百KB〜数MB のメモリを消費します。64×64なら4倍、128×128なら16倍。何も工夫しなければ、ブラウザのメモリを簡単に食い潰してしまいます。
Pixnoteはこの問題に対して、メモリ、圧縮、通信、描画のあらゆる面で工夫を重ねています。
パレットインデックス方式 — 1ピクセル1バイトの世界
通常のCanvas画像データは1ピクセルにつきRGBA 4バイトを消費します。しかしドット絵は使う色数が限られている — この特性を最大限に活かすのがPixnoteの設計思想です。
Pixnoteは各レイヤーに indexMap(Uint8Array)という独自のデータ構造を持っています。各ピクセルに対して「パレットの何番目の色を使っているか」をたった1バイトで記録します。RGBA方式の4バイトに対して メモリ消費量は1/4。256×256キャンバスなら、indexMapはわずか64KBです。同じ情報をRGBAで持つと256KB。このデータはパレット色の一括変更にも使われ、全ピクセルを走査して該当色を瞬時に書き換えられます。
Undo履歴の段階的圧縮
Undo(元に戻す)機能はエディタの生命線ですが、最もメモリを消費する機能でもあります。Pixnoteはここに独自の段階的圧縮を導入しています。
まず、キャンバスサイズとレイヤー数から1ステップのデータサイズを算出し、300MBのメモリ予算内で何ステップ保持できるかを動的に計算します。小さなキャンバスなら最大50ステップ、大きなキャンバスでも最低5ステップを確保。さらに、現在の操作位置から離れた古い履歴は、生のImageDataからPNG Blobに変換してメモリ上で圧縮します。直近の数ステップだけを即時復元可能な状態で保持し、残りは圧縮状態で待機させる — CPUとメモリの最適なバランスを取っています。
保存データの徹底的な圧縮
クラウド保存やエクスポート時のデータサイズも、通信コストとストレージに直結します。Pixnoteは複数の圧縮戦略を組み合わせて、転送量を最小限に抑えています。
Differential PNG(差分PNG)— パレットで描画されたピクセルは、indexMapに色情報がすでに記録されています。保存時にPNG側の該当ピクセルを透明化し、純粋なパレット描画のレイヤーは実質的に空のPNG(約100バイト)にまで圧縮します。読み込み時はindexMapから復元するため、データの欠損はありません。
indexMapのGzip圧縮— ドット絵は同じ色が広い範囲に連続する傾向があります。この特性はGzip圧縮と極めて相性が良く、CompressionStream APIを使って 約83%の圧縮率 を達成しています。
条件付きWebP変換— PNGサイズが100KBを超える場合のみWebP形式への変換を試み、WebPの方が小さい場合にだけ採用します。闇雲にフォーマットを変換するのではなく、実際にサイズが縮む場合のみ切り替える堅実な判断です。
通信の最小化 — 送るのは変わったものだけ
画像データのネットワーク転送は、テキストのそれとは比較にならないコストがかかります。Pixnoteは「必要最小限しか送らない」を徹底しています。
SHA-256ハッシュによる重複排除— アップロード前に各データのハッシュをサーバーに問い合わせ、すでに存在するデータは送信しません。同じ画像を何度保存しても、実際にアップロードされるのは初回の1回だけです。
変更レイヤーだけを同期— 10レイヤーある作品でも、変更があったレイヤーだけをアップロードします。残り9レイヤーの再送信は不要。
インテリジェントなバッチ処理— 複数のデータを500KB以下のバッチにまとめ、HTTPリクエスト数を大幅に削減します。リクエスト1件ごとのオーバーヘッド(TLS、ヘッダー等)を考えると、この集約の効果は大きい。
描画パフォーマンスの地道な工夫
体感の「軽さ」を支えているのは、一つひとつは地味だけれど積み重なると大きな差になる最適化の数々です。
Canvas 2DコンテキストのwillReadFrequentlyフラグを有効にして、getImageData/putImageDataの頻繁な呼び出しに備え、ブラウザがGPUメモリではなくCPUメモリにピクセルデータを配置するように指示しています。ドラッグ操作中はUIの全体更新を抑制し、座標表示だけを軽量に更新。選択範囲の回転プレビューはキャッシュし、角度やサイズが変わらない限り再計算しません。選択範囲のマーチングアンツ(点線アニメーション)はrequestAnimationFrameでディスプレイのリフレッシュレートに同期し、無駄な描画を防いでいます。
ここで紹介したのは、Pixnoteが実装している最適化のほんの一部です。コードの随所に、メモリを1バイトでも節約し、CPUの計算を1回でも減らし、通信を1リクエストでも少なくするための工夫が散りばめられています。どれも華やかな技術ではありません。しかし、ブラウザという制約のある環境で「ストレスなく描ける」体験を実現するためには、こうした地道な積み重ねが不可欠です。
ネイティブアプリならOSのリソースを比較的自由に使えます。しかしブラウザアプリは、限られたメモリ・CPU・GPUの中で勝負する必要があります。だからこそ、与えられたリソースに敬意を払い、無駄にしない。その姿勢がPixnoteの全コードに通底しています。
余談:リソースが潤沢な時代の省エネ
ハードウェアの性能は毎年上がっています。メモリは安くなり、CPUは速くなり、通信帯域は広がり続けている。じゃあ最適化なんて気にしなくていいのかというと、実はそうでもありません。
コンピュータサイエンスに「計算量(オーダー)」という概念があります。O(n)で済むアルゴリズムをO(n²)で書いてしまうと、CPUのクロックが2倍になっても、データが2倍になれば4倍遅くなる。ムーアの法則はアルゴリズムの非効率を救ってくれません。暗号処理やハッシュ計算のように、数学的に一定の計算量が不可避な処理もあります。どんなに速いマシンでも、計算量そのものは減らせない。だから「速いマシンを使えば解決」とはならない場面が、ソフトウェアには普通にあるわけです。
もうひとつ、忘れがちなのが電力です。無駄な計算は無駄な電力消費。世界中で何億台ものデバイスが動いている時代に、ソフトウェアの効率が少し改善されるだけでもインパクトは大きい。省メモリ・省CPUなソフトウェアは、結果として省エネなソフトウェアでもあります。
リソースが潤沢な時代だからこそ、ケチケチ使っていきましょう。その方がユーザーのデバイスも快適だし、バッテリーも長持ちするし、地球にもちょっとだけ優しい。みんなで省エネ、悪くない話です。
次に来る技術 — ブラウザの未来
Web技術の進化は止まりません。現在策定・実装が進んでいる技術は、ブラウザの可能性をさらに大きく広げるものばかりです。
WebGPU
WebGLの後継となる次世代グラフィックスAPI。Vulkan / Metal / DirectX 12のような低レベルGPUアクセスをWebに持ち込みます。WebGLと比較して描画コール数を劇的に削減でき、コンピュートシェーダーによるGPGPU(GPUを汎用計算に利用)も可能に。画像処理、物理シミュレーション、さらにはブラウザ上でのAI推論の加速にも期待されています。
WebNN (Web Neural Network API)
ブラウザ上でニューラルネットワークの推論をハードウェアアクセラレーション付きで実行するためのAPIです。CPU、GPU、さらには専用のNPU(Neural Processing Unit)を活用できます。将来的には、ドット絵エディタにAIアシスタント機能(自動配色提案、スタイル変換、補間フレーム生成など)をブラウザ内で完結する形で搭載できるようになるかもしれません。
WebCodecs / WebTransport
WebCodecsは動画・音声のエンコード/デコードをブラウザで直接行うAPI。WebTransportはHTTP/3ベースの低遅延双方向通信プロトコル。組み合わせることで、ブラウザからのリアルタイム映像配信や、低遅延なコラボレーション編集が可能になります。
View Transitions API
ページ遷移やDOM変更時にネイティブアプリのようなスムーズなアニメーション効果を追加するAPIです。ブラウザがUIスナップショットを管理し、新旧の状態間を自動的にアニメーション補間します。「Webサイトっぽさ」を払拭し、よりアプリケーションらしい体験を実現します。
なぜWebが選ばれるのか — プラットフォームとしての哲学
技術的な話を続けてきましたが、最後にWeb技術が他のプラットフォームと本質的に異なる点について触れておきたいと思います。これはPixnoteがブラウザベースであることの、最も根本的な理由でもあります。
URLという発明
URLは人類最大の発明のひとつです。たった1行のテキストで、世界中の誰にでもアプリケーションを共有できます。「このURLを開いてみて」— この一言だけで、相手はあなたと同じツールを、同じ環境で使い始められます。インストールも、セットアップも不要。URLそのものがアプリケーションへの入口です。
オープンスタンダード
Web技術はW3C、WHATWG、TC39といった標準化団体によってオープンに策定されています。特定の企業が技術を独占することはなく、誰でも仕様を読み、実装し、利用できます。このオープン性が、ブラウザ間の競争を健全に保ち、技術の継続的な進化を保証しています。
後方互換性 — Webは「壊さない」
1995年に作られたWebページを、今日のブラウザで開いてみてください。ちゃんと表示されます。30年前のコンテンツが、何の変換もなしにそのまま動く。これは他のプラットフォームではまずありえないことです。App Storeから消えたアプリは二度と使えません。OSのメジャーアップデートで動かなくなるソフトも珍しくない。でもWebは「既存のものを壊さない」を30年間貫いてきました。あなたが今日Pixnoteで描いた作品のURLは、10年後もきっと開けます。
View Source — 誰でもカンニングできる
右クリック →「ページのソースを表示」。たったこれだけで、あらゆるWebサイトの仕組みを覗くことができます。この透明性は革命的です。「このサイトのアニメーション、どうやってるんだろう?」と思ったら、答えはいつでもそこにある。世界中の何百万人もの開発者が、View Sourceから学んでプロになりました。正直に言うと、Pixnoteの制作者もそのひとりです。
常に最新、全員同じバージョン
「アップデートが利用可能です」— このポップアップにうんざりしたことはありませんか? Webアプリにはこの問題がありません。アクセスした瞬間が常に最新版です。バージョン違いによる不具合も、アップデートの待ち時間もゼロ。開発側にとっても、「あなたのバージョンはいくつですか?」というサポート対応が不要になります。全員が常に同じバージョンを使っている。シンプルで、健全です。
サンドボックス — 安全がデフォルト
ブラウザはとても慎重です。Webアプリがカメラを使いたいとき、ファイルにアクセスしたいとき、位置情報を取得したいとき — すべて「あなたの許可」が必要です。ネイティブアプリでは、インストールした時点で多くの権限が渡ってしまうことがありますが、ブラウザは逆。デフォルトは「何もさせない」で、ひとつずつ許可を求めてくる。ちょっと堅すぎるくらいですが、それくらいがちょうどいい。安全側に倒しておくのは、良い設計の基本です。
Pixnoteがブラウザベースであるのは、これらの理由が重なり合った結果です。URLひとつでアクセスでき、常に最新で、ソースを見て学べて、30年後も壊れず、安全がデフォルトで、オープンスタンダードの上に成り立っている。これだけの条件を同時に満たすプラットフォームは、Web以外にありません。