【ITニュース解説】Building a Real-Time Multiplayer Drawing Game
2025年09月09日に「Dev.to」が公開したITニュース「Building a Real-Time Multiplayer Drawing Game」について初心者にもわかりやすく解説しています。
ITニュース概要
リアルタイムお絵かきゲーム開発で、データ同期やコスト問題を解決した事例。AIをプレイヤーとして扱う設計で開発を単純化。通信データはJSONからバイナリ形式にして9割削減し、API呼び出しはキャッシュで節約して低コスト運用を実現した。
ITニュース解説
リアルタイムで複数のプレイヤーが同時にお絵かきできるオンラインゲームを開発するには、一見シンプルに見える裏側で多くの技術的な課題を解決する必要がある。主な課題は、世界中のプレイヤーのデバイス間で描画内容を遅延なく完全に同期させること、大量に発生する描画データの通信を効率化すること、ゲームを面白くするAI機能を低コストで組み込むこと、そして将来的に多くのユーザーが遊べるようにシステムを拡張可能にすることである。これらの課題を解決するために、アーキテクチャ設計からデータ通信方式、コスト管理に至るまで、様々な工夫が凝らされている。
この開発における最も画期的な決断は、AIの扱いにあった。通常、AI機能はゲーム本体とは別の専用サーバーとして構築されることが多い。しかし、このゲームではAIをゲームルームに参加する「一人のプレイヤー」として設計した。つまり、AIは人間と同じようにゲームセッションに参加し、他のプレイヤーの描画データをリアルタイムで受け取り、それに対してコメントを返すという役割を担う。このシンプルな発想の転換により、開発は劇的に効率化された。AI専用の複雑な通信システムを新たに作る必要がなく、すでに構築済みだったプレイヤー間のリアルタイム通信や音声ストリーミングといったマルチプレイヤー用の基盤をそのまま流用できたからだ。さらに、万が一AIのプロセスが停止しても、他のプレイヤーが回線切断から復帰するように、簡単にゲームに再参加できるという耐障害性のメリットも生まれた。
お絵かきゲームでは、プレイヤーがペンを動かすたびに座標データが連続的に発生し、膨大な量のデータがネットワークを行き交う。このデータ量をいかに削減するかが、遅延のないスムーズな描き心地を実現する鍵となる。そこで、描画データを送受信する際のデータ形式を、一般的なWeb技術でよく使われるJSON形式からバイナリプロトコルへと変更した。JSONは人間が読みやすいテキスト形式だが、その分データサイズが大きくなる傾向がある。一方、バイナリプロトコルはコンピュータが直接解釈しやすい数値の羅列でデータを表現するため、非常にコンパクトになる。この変更によって、ネットワーク帯域の使用量を実に90%も削減することに成功した。また、様々な画面サイズのデバイスに対応するため、座標データの正規化も行われた。これは、キャンバス上の座標を「横0.5、縦0.2」のように、画面サイズに依存しない0から1の間の比率で管理する手法である。各プレイヤーのデバイス側で、この比率を基に実際の表示座標を計算することで、巨大なデスクトップモニターでも小さなスマートフォンの画面でも、全く同じ絵が描かれることを保証している。
AI、特に画像認識などのAPIサービスは、呼び出し回数に応じて料金が発生するため、コスト管理が極めて重要になる。開発初期の試算では、1ゲームあたりのコストが高額になり、事業として成り立たないレベルだった。この問題を解決するために、二つの主要な最適化が施された。一つ目は、AIの分析結果を積極的にキャッシュすることだ。プレイヤーが何かを描くたびに、その描画内容をハッシュ値という一意のデータに変換し、AIの分析結果とセットで保存しておく。もし別の機会に全く同じ内容が描かれた場合、再び高価なAIのAPIを呼び出すのではなく、保存しておいたキャッシュから結果を即座に返す。これにより、無駄なAPI呼び出しを大幅に削減した。二つ目は、AIを呼び出すタイミングの最適化である。プレイヤーが線を一本引くたびにAIに分析させるのではなく、描画内容に「意味のある変化」が蓄積されたと判断された場合にのみ、まとめて分析を実行するようにした。これらの工夫により、当初の数分の一までコストを圧縮することに成功した。
マルチプレイヤーゲームにおいて最も難しい課題の一つが、全プレイヤーのゲーム状態を完全に一致させることである。各プレイヤーの通信環境には差があるため、操作の順序が入れ替わったり、一部のプレイヤーだけ情報が欠落したりといった問題が起こりやすい。この「状態の不整合」を防ぐため、このゲームでは「信頼できる唯一の情報源(Authoritative Source)」を定めるアプローチを採用した。そして、その重要な役割をAIプレイヤーに担わせた。全てのプレイヤーからの描画データは、まずこのAIプレイヤーに集約される。AIプレイヤーは受け取ったデータを正しい順序で処理し、確定したゲーム状態を全プレイヤーに向けて一斉に配信する。これにより、各プレイヤーの画面には常に同じ状態が反映され、矛盾が生じることを防いでいる。また、プレイヤーが途中でゲームから切断されても、再接続時にこのAIプレイヤーから最新のゲーム状態を受け取ることで、何事もなかったかのようにスムーズに復帰できる仕組みとなっている。
これらの技術的な工夫を積み重ねた結果、1ルームあたり12人が同時にプレイでき、描画の遅延を100ミリ秒未満に抑え、さらに運用コストもごくわずかに抑えた、高品質なリアルタイムお絵かきゲームが完成した。この開発事例は、現代のシステム開発における重要な教訓を示している。複雑なネットワーク処理などは自前で構築せず、クラウド事業者が提供するマネージドサービスを活用して本来のゲームロジック開発に集中すること。大量のデータを扱う場合は、JSONのようなテキスト形式だけでなく、バイナリプロトコルのような効率的な形式も検討すること。そして、高価な外部APIを利用する際はキャッシュを徹底的に活用し、システムは必ず故障するという前提で回復機能を設計しておくことの重要性だ。