マルチプレイヤーゲームの Client-Server 勉強ノート
2019-04-12
(Updated : 2020-10-16)
この文書は
リアルタイム・マルチプレイヤー・オンラインゲームの Client-Server を作る際の、 基礎知識・周辺技術・世の事例をまとめたノート。設計時に振り返る用。
基礎知識
- Game server - Wikipedia
- マルチプレイゲームにおけるサーバの用語定義(英語)
用語 | 意味 |
---|---|
Dedicated server | ゲームの世界をシミュレートする専用サーバ。 データセンターやクラウドでホスティングされるサーバを指す |
Listen server | Client と同じプロセスで実行されるサーバ(Client ホスト) |
Peer-to-Peer | 各 Client どうしが直接通信するモデル。デメリットは色々あるが、 オブジェクトが多くプレイヤー数が少ないゲームには向く |
- Peer to Peer - Wikipedia
- OSI参照モデル - Wikipedia
- TCPやUDPにおけるポート番号の一覧 - Wikipedia
- 0 〜 1023 : well known ports
NAT トラバーサル
- NAT traversal - Wikipedia
- [2008-06] NAT基礎講座
- ネットワークの基礎知識 / UDP hole punching
- [2013-12] WebRTCに使われるP2Pの技術 - tjun月1日記
- STUN / TURN サーバの図がわかりやすい
- [2016-12] NAT Traversalって知ってますか | Cerevo TechBlog
- 読み物系
- [2018-12] P2P通信でNatを越える - Qiita
- Node での Nat Traversal の実装
モバイル回線
- [2016-07] 携帯電話はどうやってMVNO設備へ接続しているの? | IIJ Engineers Blog
- [2017-07] モバイル回線で “オンラインゲーム” はできるのか? | NOV-LOG
- 格安 SIM (MVNO) のスマートフォンテザリング (LTE) で、P2P 接続であるスプラトゥーン 2 がプレイできたらしい
- データ通信量は 1 試合あたり 10 〜 15 MB とのこと
関連知識
情報源
書籍
一冊選べと言われたらこれ:
ゲームロジック実装の現場感を感じられる内容のものだと以下のあたり:
ややカジュアルだが全体観の参考になるものとして:
Web 上の記事
- [2017-10] How netcode works, and what makes ‘good’ netcode | PC Gamer
- 通信の基礎知識やネットワークモデル、ラグ補正などについて解説されている。最初に読みたい系
- ping, Routing, Update rate, Tick rate
- Dedicate game server / Client hosted (listen server) / Peer-to-peer
- クラウド上のゲームインフラの概要 | ソリューション | Google Cloud
- GCP の記事
- [2018-10] How does any MMO Games backend work? – Narendra L – Medium
- 読み物系 / Client サイド予測や、PUBG の様な広いエリアの扱いなど
- [2010-09] CEDEC 2010 | ネットゲームの裏で何が起こっているのか。ネットワークエンジニアから見た,ゲームデザインの大原則 - 4Gamer.net
- セガの人の講演 / 各ゲームジャンルにおける同期方式やネットワークモデルについて
- この当時の PSO はリレーサーバでクライアントホスト形式
- [2014-12] Cocos2d-xマルチプレイヤーアクションゲーム事始め | GREE Engineers’ Blog
- オンラインゲームの歴史的な話や、レイテンシ隠蔽テクニックについて書かれている
- [2001] Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization - Valve Developer Community
- レイテンシ隠蔽のテクニックに関するドキュメント
- Client-side Prediction (クライアントサイド予測)
- Entity Interpolation (エンティティ補間)
- Lag Compensation (ラグ補償)
- [2018-11] レポート | Supercell – Scaling Mobile Games #reinvent #GAM301|DevelopersIO
- Supercell のサーバ運用の話 / AWS を利用している
- Brawl Stars の DB は Aurora でシャーディング
- [2018-12] 勉強会レポ : Unity Network 完全に理解した - Raspberlyのブログ
- 2018年現在におけるUnity向けリアルタイムネットワークエンジン選定について - Speaker Deck
- UNET で苦しんだ人のスライド / Photon でいいよという結論
- 2018年現在におけるUnity向けリアルタイムネットワークエンジン選定について - Speaker Deck
- (論文)P2P型大規模マルチプレイヤーゲーム
- [2016-06] P2PとC/Sネットワーキング | Nettention
- 韓国のネットワークエンジン ProudNet の会社の記事
- Super peer : Listen Server 方式 / ホストクライアントがいるやつ
- 対象 peer : フルメッシュ型
Web 上のスライド
- モノビット社 / および中嶋謙互さんの スライド一覧
- [2013] 【CEDEC2013】20対20リアルタイム通信対戦オンラインゲームのサーバ開発&運営技法
- DB 構成 / サーバ構成 / 開発・テスト・運用の手法
- [2015-12] 年の瀬リアルタイム通信サーバ勉強会
- 非同期とリアルタイムのあるハイブリット型サーバな MO タイトルの事例
- ポート番号問題 / モノビットエンジンでは Client からの待ち受けポートに 4000〜9000 のポートを使用
- 負荷テストのやり方
- Photon とモノビットエンジンの比較
- [2017-10] ネットワーク ゲームにおけるTCPとUDPの使い分け
- 前半、ルーティングやパケットの基礎知識が丁寧に解説されている
- TCP は小さいウインドウサイズから始めてだんだん大きくしていく
- パケットロス時にウインドウサイズをリセットする → 通信が遅くなる(ストール)
- TCP は OS がコネクションを管理 / UDP の方がトラブルシューティングは一手間多くなる
- 61 ページ目にジャンルと必要帯域をまとめた表がある
- [2017-11] Unityネットワーク通信の基盤である「RPC」について、意外と知られていないボトルネックと、その対策法
- 最初に決める : ネットワーク構成 / プロトコル / 通信ライブラリ
- 基本的には C/S 型が望ましいが、P2P 型の方がサーバ維持費は下がる
- 最適な通信品質のためには RPC を自作した方がいいよ、という話
- 最初に決める : ネットワーク構成 / プロトコル / 通信ライブラリ
- [2018-03] 【GCC18】PUBGライクなゲームをUnityだけで早く確実に作る方法 〜ひとつのUnity上でダミークライアントを100個同時に動かす〜
- サンプルとして爆弾を投げ合うバトルロイヤルを実装
- サーバのコマンド:
- CREATE / JOIN / LEAVE / SET_OWNER
- BROADCAST / OWNERCAST / MULTICAST / NEARCAST / UNICAST
- ゲームの独自コマンドは PING / SYNC_POS / SHOOT
- Dummy クライアントで開発当初からマルチプレイの環境を保つ
- AWS は CPU より通信費が高い / 採算的には 1 プレイヤー(CCU)あたり 100 Kbps 以下が目安
- [2013] 【CEDEC2013】20対20リアルタイム通信対戦オンラインゲームのサーバ開発&運営技法
- [2018-04] モバイル対戦アクションゲームの通信最適化テクニック
- スクエニの人の資料
- (4G 回線において)クライアントは 100ms ~ 200ms 程度ごとに受信し続け、必要な時に送信するのがおすすめとのこと
- RUDP を実装する話
- スマートフォンは、近くに利用可能な Wifi があると勝手に回線を切り替えたりする
- 端末の ip アドレスが変わるので TCP/IP だと切断されてしまう
- TCP/IP のパケット受信はシステムコールで、CPU 負荷が高い
- UDP を利用 : 定価 5000 円程度/月のサーバ 1 台で、同時 1 万接続を余裕でさばける
- サーバの処理コストを下げる Tips が載っている
- [2015-05] オンラインゲームの仕組みと工夫
- オンラインゲームの種別 / OSS である Quake の仕組みについて
- [2016-05] リアルタイム通信ゲームの実装例
- Aiming の人のスライド / 通信部分のライブラリを作った話
- [2017-06] 「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
- MagicOnion の人のスライド
- サーバ構成図がある / リアルタイム部分は Blue/Green
フォーラム系
- [2013-12] Limitations of p2p multiplayer games vs client-server - Game Development Stack Exchange
- P2P 型と C/S 型の Pros / Cons について
- [2016-06] Peer-to-Peer vs Client-Server vs Dedicated Server Networking - Unity Answers
- 各種ネットワーク構成やツールの Pros / Cons について
- [2018-03] ネット対戦型ゲームの通信方式でP2Pを採用したゲームは自前サーバーを介するよりも通信速度や安定性に問題が生じ易いですがそれは何故でしょうか? - Quora
世の中の事例系
- スプラトゥーン は(2 も含め)P2P らしい
- Switch Online が有料化されたのもあり専用サーバを置いてるものだと思っていたので意外
- ※ マッチングサーバは AWS に置かれている模様
- [2015-11] 実践イカパケット解析
- [2017-03] kanai6274’s blog: スプラトゥーン2を快適に楽しむためのネットワーク環境づくり
- [2017-07] kanai6274’s blog: スプラトゥーン2 サーモンランの通信方式を推測
- [2017-08] スプラトゥーン2のオンライン環境は前作より悪化している AN IN-DEPTH LOOK AT ONLINE MULTIPLAYER IN SPLATOON 2 日本語要約 - YONの土鳩ブログ
- ※ 英語の原文はリンクが切れていて見つからなかった
- 専用サーバを置かないのにオンラインを有料化することに対しての批判が主題だが、 専用サーバ / クライアントホスト / P2P の違いについて丁寧に解説されていて分かりやすい
- P2P はトラフィックの無駄も多く、チートもしやすいのでマルチの対戦には向かない
- [2018-10] Splatoon 2’s Netcode and Matchmaking: An In-Depth Look | oatmealdome.me
- Nintendo has a peer-to-peer networking library called “pia”. They also have a matchmaking library called NEX. These libraries are used in many first-party games.
- ダークソウル は PS3 版では P2P だったが、リマスター版で専用サーバが導入され、 最大プレイ人数が 4 人 → 6 人に増えている
- Destiny 2 は C/S と P2P のハイブリッドで、複雑なことをやっているらしい
- Overwatch は専用サーバがある
- 白猫プロジェクト は WebSocket を用いたリレーサーバで、Host-Guest 方式
- [2015-04] (スライド) 白猫プロジェクトの裏側!~パフォーマンスチューニングとリアルタイム通信の全て~
- WebSocket のサーバは Node と Nginx
- [2015-12] 勉強会メモ | 白猫プロジェクトの裏側 〜リアルタイム通信と、コロプラのサーバサイドの全貌〜 - Qiita
- [2015-04] (スライド) 白猫プロジェクトの裏側!~パフォーマンスチューニングとリアルタイム通信の全て~
- グランブルファンタジー も WebSocket / まあ Web ベースだからな
- [2017-02] グランブルーファンタジーを支えるインフラの技術 - Speaker Deck
- Pub/Sub メッセージモデル
- [2017-02] グランブルーファンタジーを支えるインフラの技術 - Speaker Deck
- ポコロンダンジョンズ も Node で WebSocket
- [2016-05] リアルタイム通信ゲーム勉強会で発表してきた | サイバーエージェント 公式エンジニアブログ
- Client 側の話もある(Client は Cocos-2d)
- [2016-05] リアルタイム通信ゲーム勉強会で発表してきた | サイバーエージェント 公式エンジニアブログ
- モンスト は TURN サーバ
- [2019-07] モンスターストライクのリアルタイム通信を支える技術 - ログミーTech
世のゲームの通信量
※ Web を日本語や英語で適当に検索して見かけた数字をもとにした数字感を示す
- スプラトゥーン2 は 1 マッチ 10 〜 15 MB と結構大きめ
- Brawl Stars は 3 分のマッチで 3 MBとか、1 時間遊んでたら 15 〜 30 MB とか
SaaS / 通信ミドルウェア
Photon
この手のやつでよく使われている印象のあるメジャーどころ。
UNET (Unity Multiplayer)
Unity 5.1 (2015-06) の時に用意された Unity 公式のネットワークライブラリ。 リレーサーバ形式。ホストマイグレーションができなかったり、品質面だったりであまり評判は良くなかった模様。
2018 年時点で 廃止予定 であることが発表されているため、今後の新規開発では選択肢に入らないだろう。
Unity 公式の今後のネットワーク機能
Google と提携し、今後は Client-Server 型の新しいネットワーク機能を提供していく展望の様子。
- Connected games
- [2018-08] UNet を乗り越え、マルチプレイヤーゲームはさらなる進化へ – Unity Blog
- [2018-11] (動画) Connected Games: Building real-time multiplayer games with Unity and Google - Unite LA - YouTube
モノビットエンジン
国内産の通信ミドルウェアではモノビット社のエンジンもよく使われている。
採用事例:
- ブレイブフロンティア、LORD of VERMILION ARENA、城とドラゴン、コトダマンなど
MagicOnion
ちょっと毛色が違うが gRPC 上で双方向通信を実現するフレームワークもある:
ネットワークモデル
オンラインゲーム開発において主要なネットワーク構成 / ネットワークトポロジをまとめる。
P2P (Peer-to-Peer)
- 端末同士が直接通信する形式
- インターネット経由の通信の場合、大抵のケースで NAT 越え が必要になる
- スター型は 1 台の端末が Host となり、Guest は Host だけに接続する形式
- Listen Server 方式とも言う。また、Host を Listen peer や Super peer と呼んだりもする
- フルメッシュ型は互いに座標情報などを送り合う形式
- 全体の通信量が無駄に増え、同時プレイの最大人数に制約がかかる
- チート耐性が無い
- サーバが無いため、運営側にとってはサーバ代がかからないという経済的なメリットがある
- このためインディーズゲームなどでは採用されやすい
- 1 vs 1 の格闘ゲームのような、人数が少なく同期性が重視されるゲームに向く
- 複数人の同時プレイゲームでは、各プレイヤーの同期だったり通信の安定性を確保するのが難しくなる
Client-Server モデル
- 通信にサーバを挟む形式
- クライアントホスト型は、リレーサーバを置いてパケットを中継する
- リレーサーバで NAT 越えを解決したスター型の P2P (Listen Server)ともみなせる
- ゲームロジックの処理は Host Client が行う
- P2P と同様にチート耐性が低い
- Host に負荷が集中するため同時プレイの最大人数に制約がかかる
- 専用サーバ型は、ゲームロジックの処理をサーバ側で行う
- チート耐性がある
- 通信 / ゲームの継続可能性を安定させやすい
- サーバの運用・開発コストは最も高くなる