初心者でもわかる！「オンラインゲームにおける仕組み」を学んでみよう【前編】

# 最初に
本記事では、非エンジニアな方でも理解しやすいように「オンラインアクションゲームを開発するにあたって知っておきたい仕組み」について、丁寧に解説していきます。


対象読者は以下の通りです。

- ゲームサーバーを運営したり、シンプルなオンラインゲームを構築した経験があり、実際の開発ではどういった仕組みを用いているのか興味がある方
- プログラムやゲームエンジンを触ったことがあり、オンラインゲーム開発の基礎について学びたい方
- なんもわからんけど知見として持っておきたい方

<br>
今回、前編と後編で記事を分割しています。

前編で紹介する内容は以下の通りとなります。

- **ゲーム開発における基本用語**
- **非同期型について**
- **非同期型における「アイテムデュープ」などの問題**

<br>

後編では以下の内容を記載します。

- **同期型について**
- **同期型におけるフルメッシュ型とスター型の違い**
- **C/SやP2Pの簡単な概要について**
- **グローバルIPアドレスとプライベートIPアドレスについて**
- **NAT問題について**
- **リレーサーバ方式について**

<br>

逆に今回解説しない項目は以下の通りです。

- MMO型とMO型の違い
- 非同期型のフルメッシュ型やスター型における概要
- TCPやUDP、RUDPに関する詳細な説明
- 非同期型における「アイテムデュープ」などの問題に対しての説明

TCPやUDP、RUDPに関する詳細な説明は以下の記事を参考頂ければと思います。
(ﾁｮｯﾄﾌﾙｲので、最新の記事もチェックしてみてください)
➡[ネトゲや配信で使い分けられてるTCPとUDP、RUDPの概念から勉強し直してみた](https://qiita.com/4_mio_11/items/cd3efe0345eee75c3ae2)

<br>

# ゲーム開発における基本用語の確認

まずは全体に共通する基本的な用語から確認してみましょう。

こちらは既に知見がある方であればスキップしていただいても問題ありません。



## フレームレート（FPS）
**フレームレート（FPS）** は、「1秒ごとに処理される絵の枚数」という意味で、映像作品やゲームの滑らかさを決定する重要な要素です。例えば1秒ごとに30枚の絵が動いているなら30fps、60枚の絵なら60fpsです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/7c01bcba-4b4d-188c-4180-849d090ee967.png)

<br>

以下はそれぞれのFPSが向いているゲームジャンルや端末スペックについて、参考程度にまとめたものとなります。

| FPS数値       |   向いているジャンル |    端末スペック    |
|:-----------------|-------------------|:-------------------|
| **~30 fps**          |  2D系または映画のような見せ方をメインとするRPGやアクションゲーム。**高速な反応が必要とならないもの。** |        低〜中程度のスペックを持つPCやコンソール、モバイルデバイス。高解像度でのプレイを優先する場合にも選択される。        |
| **~60 fps**          |  アクションゲーム、FPS、TPS、レースゲーム、スポーツゲームなど。速い反応速度と滑らかな画面遷移が求められるもの。**一般的なゲームプレイにおいてバランスの良い選択。** |     中〜高性能のPCやゲームコンソール。  |
| **~90 fps**          |  **VRゲームにおける最低基準の数値**となる。これ以下だとVR酔いと呼ばれる、車酔いによく似た症状を引き起こすリスクが高まる。 |  中〜高性能のPCや最新世代のゲームコンソール。Meta QuestやPS VRなどの専用機器が必要。  |
| **~120 fps 以上**        |  競技性が高いeスポーツタイトルや、非常に高速な反応を必要とするアクションゲーム。**プレイヤーがわずかな動きや反応の違いを感じ取る必要があるもの。** |     高性能のPCや最新世代のゲームコンソール。また、120Hz以上のリフレッシュレートをサポートする高性能ディスプレイが必要。  |

<details><summary>29.97fpsや59.94fpsとは？</summary><div>

- 29.97fpsや59.94fpsといったフレームレートは、1950年代のカラーテレビ導入時に白黒テレビとの互換性を維持するために生まれた
- カラー放送での信号干渉を避けるためにフレームレートを僅かに減速させる必要があり、それが29.97fpsの採用につながった
- このフレームレートはテレビ、映画、ビデオゲームの標準となり、現在も放送や再生機器の互換性のために使用されている

</div></details>


<br>

## 遅延（レイテンシ）

オンラインゲームとは切っても切れない関係にある問題が **「遅延（レイテンシ）」** です。

遅延とは、プレイヤーがゲーム内でアクション（例えば、攻撃ボタンを押す、キャラクターを動かすなど）を起こしてから、そのアクションがゲームサーバーによって処理され、最終的にプレイヤーの画面上でその結果が反映されるまでの時間差のことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/9a1bca33-4c9f-5206-5a49-2606f3535226.png)


遅延を完全に０にすることは、技術的に難しいです。

大幅な遅延や頻繁に遅延が起こる場合、ゲーム内での反応速度の低下や操作感を悪化させ、開発者の意図していない挙動や、バグを引き起こしてしまいます。

遅延の原因は多岐にわたりますが、主な原因としては以下のようなものが挙げられます。
<br>

### ネットワーク遅延
オンラインのゲームで、プレイヤーの入力データやゲーム情報が、サーバーを介して別のプレイヤーとの間を行き来する際に発生します。これはインターネット接続の安定性や速度、サーバーとプレイヤー間の距離などが影響します。

#### **【対策】**

オンラインゲームをプレイする際、有線接続（Ethernetなど）を利用すると遅延を減らすことができます。

有線接続はワイヤレスに比べて信号干渉が少なく、データの送受信が安定して行えるため、ゲーム中のラグが顕著に減少します。

また、ゲームサーバーを自分の地理的位置に近いものを選択することで、データの往復時間が短くなり、ネットワーク遅延の減少に繋がることもあります。

他にも以下の要因に気を付けることで、遅延が起こるリスクを避けることができます。

- **帯域幅の確保**：
他のアプリケーションやデバイスが同時に大量のデータを通信していると、オンラインゲームのパフォーマンスに影響を与える可能性があります。ゲームをプレイしている間は、不要な通信を避け、帯域幅を確保することも有効な対策です。
- **品質の良いハードウェアとソフトウェアの使用**：
ネットワーク機器（ルーターやモデムなど）の品質も重要です。高品質の機器を使用し、常に最新のファームウェアに更新しておくことで、接続の安定性と速度が向上します。
- **VPNの使用を避ける**：
VPNを使用すると、データのルーティング経路が長くなりがちで、それによって遅延が増加する可能性があります。特に速度やレイテンシが重要なオンラインゲームをプレイする際は、VPNの使用を避けるか、ゲームに最適化されたVPNサービスを選択することが推奨されます。

<br>

### 処理遅延
処理遅延は、ゲームのグラフィックや物理演算などの処理が原因で発生します。ゲームの最適化、グラフィックボード、CPUの性能が、ここに大きく影響します。

#### **【対策】**

以下の二つのハードウェアを高性能にすることで、遅延を減らせる可能性があります。

- CPU：
高性能なCPUは、ゲームのロジック、AIの決定、衝突判定、物理演算（例えばオブジェクトの揺れや落下）、ユーザー入力などを高速に処理することができます。CPUを強化することで、ゲーム内でのアクションがスムーズに処理されるようになり、入力 → 結果までの時間が短縮されます。
- GPU：
高性能なGPUは、ゲームのグラフィック処理、特に複雑なシーンのレンダリングや高解像度でのゲームプレイを実現します。GPUが迅速に画像を処理することで、表示遅延が減少し、リアルタイムに近い体験が可能になります。

開発者サイドで対策をするとしたら、ゲームの最適化や不要な処理の削除が、ゲームのシステム処理による遅延を減らす助けとなります。

<br>

### 表示遅延

表示遅延は、ゲーム映像がディスプレイ上に表示されるまでの時間に関連します。これはディスプレイのリフレッシュレートや応答速度に依存します。

#### **【対策】**

高リフレッシュレートを持つモニターを使用することで、画面の更新頻度が高くなり、表示される画像がより滑らかになります。これにより、GPUからの画像データが即座に更新され、視覚的な遅延が減少します。

<br>

## ゲーム中の反応速度（レスポンス）

ここでいう「レスポンス」とは、「認知→判断→操作」の速度を意味します。

具体的な例をあげましょう。

プレイヤーはゲーム内の情報を認知し、その情報に基づいて、次に何をするかの判断を下します。その後、プレイヤーは操作を行うために、キーボード、マウスやコントローラーを通じて入力します。これらの一連の流れを行うまでの速さが反応速度に当たります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/2f629d50-350b-c57c-3689-22f93ce8b9af.png)

### プレイヤーの認識速度について

人間の認識速度は、その人が置かれている状況や条件に大きく依存します。

例えば、慣れている動作や状況、集中している状況では0.1秒～0.2秒の範囲で反応が可能となります。もしも、その次に何をするべきか、何が起こるかを予測できていれば、さらに速い0.05秒で反応することも可能となります。さらに、自分自身で意図して行う動きについては、わずか0.01秒という極めて短い時間で認識し、反応することができます。

<br>

### ゲームにおけるフレームレートの重要性

多くのテレビやモニターでは60FPSを基準としており、これは1フレームあたりの表示時間が約0.0167秒であることを意味します。特にeスポーツや格闘ゲームなどでは、プレイヤーはこの1フレームの違いを見極め、操作を行います。そのため、わずか1フレーム、つまり0.0167秒の差が勝敗を分けることも少なくありません。

<br>

### オンラインゲームにおけるレスポンスの課題

高速なレスポンスが求められるタイプのオンラインゲームでは、全プレイヤーに対して、各プレイヤーの操作情報を1フレームの間に正確に配信する必要があります。これは、ゲーム内での即時性と相互作用を保証し、公平かつ緊張感のあるプレイを提供するために不可欠です。

しかし、上記で説明した遅延の問題が発生すると、この繊細なバランスが崩れ、ゲーム体験の質を低下させる可能性があります。

<br>

上記のような、高度なレスポンス要求を実現しているゲーム例としては、『Apex Legends』や『フォートナイト』が挙げられます。

<br>

# オンラインアクションゲームにおけるジャンルごとの仕組み

「オンラインのアクションゲーム」と一言で言っても、実はさまざまな種類があり、それぞれでインターネットを使ったやり取りの仕組みが違います。

## FPSやTPS、MMO、アクションRPGのゲーム

オンラインのアクションゲームをより大きな規模で楽しめるようにするためには、より多くのプレイヤーや広いフィールドが必要です。しかし、プレイヤー数やフィールドの大きさが増えると、通信で扱うデータ量も多くなり、ゲームの遅延が目立つようになっていきます。

この遅れを100ミリ秒以下であれば許容し、遅れをゲーム側で調整して、対戦をスムーズに進める方法を **「非同期式」** と呼びます。

例えば、『スプラトゥーン』や『ファンタシースターオンライン』などのゲームがこの方法を使っています。

非同期式を採用すると、ゲームの進行状況がそれぞれのプレイヤーの端末によって異なることになります。これは、すべての端末間でゲームの状態を完全に一致させるのではなく、一部で遅れがあることを受け入れることを意味します。



どの部分で妥協をするかは、ゲームの内容を深く理解して分析する必要があります。ここでは、プレイヤー同士が対戦するゲームを非同期式で実装する場合を例に挙げてみましょう。

<br>

### 非同期式によるPvP

2人のプレイヤー、AとBが、それぞれ自分のキャラクターを操作している格闘ゲームのワンシーンを想像してみてください。

ゲーム内でキャラクターが行うことのできるアクションを、以下の3つとします。
<br>

- 攻撃
- 回避
- ノックアウトする/される

<br>
このゲームは60FPSで動くため、画面は16ミリ秒ごとに更新されます。

一般的な3Dの格闘ゲームでは「攻撃」を行った際に200ミリ秒～500ミリ秒、つまり10～30フレームを使って攻撃の動作を表現します。この動作のことを、今回は「モーション」と呼びましょう。

モーションの再生中は、毎フレーム、異なる座標に対して当たり判定を設定しています。例えば、パンチの攻撃の場合、キャラクターの拳の位置はモーションに合わせて動き、それに合わせて攻撃の当たり判定位置も変わります。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/a4d823a5-b0e6-90e7-263d-d77ca3a99a42.png)


パンチ攻撃モーションの衝突範囲と、キャラクターの当たり判定が重なった時に、攻撃は「ヒットした」ことになります。

例えば、上の図の15フレーム目で、Aのキャラクターがダメージをもらったとします。

そのデータを率直に送った場合の通信の流れは以下の図の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/d83a21cb-3507-a081-17b8-4088fcf3ad86.png)

上記の通り、「ダメージを与えた」というデータだけ送信した場合、Aから見ると納得ができない状態になります。

ですので、以下のように、「攻撃ボタンを押した」というデータも送る必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/eafa5c1e-c464-221f-571e-d16971b767be.png)

<br>

Aが何もせず、ただ攻撃を受けていた場合はこの流れで問題ありません。

ですが、実際の対戦では、Aも反射神経を駆使して回避行動などを行うでしょう。もしも、Aが回避行動をした場合には、Aのキャラクターの当たり判定も時間経過と共に変化するはずです。

この回避行動が、プレイヤーBの攻撃タイミングと**ほぼ同時だった場合**に問題が発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/a2adab76-f75c-333b-74c4-48ad415ddf57.png)

Bが攻撃を行ったという情報をAが受信する頃には、Aはすでに避ける動作を開始しています。

つまり、「**Bから見たら攻撃は当たっている**」のですが、「**Aから見たら攻撃は当たっていない**」のです。

情報の食い違いが発生すると、双方のHPの結果が異なってしまいます。この場合の解決策として、**AとBどちらの結果を採用するか**、決める必要があります。これが非同期式における一部の妥協です。

以下に、それぞれの結果を採用した場合の例を書き出してみます。

#### **攻撃側（B）の結果を採用**

A視点では、Aは回避行動をしているため、ダメージは入らないはずです。ですが、Bの結果を優先してるため、ダメージが入ります。この場合、BはAに攻撃結果を送信し、Aの環境では、そのデータを反映します。

Aから見ると回避できていたはずなのにダメージを受けてしまい、理不尽さを感じてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/822c15af-d948-294d-8795-49690800a661.png)

<br>


#### **防御側（B）の結果を採用**
この場合、B側では攻撃動作の情報をデータとして送り、一瞬だけダメージが入った判定になります。ですが、Aが回避成功した場合、AからBに対して「攻撃は回避されたため、ダメージは0」というデータを送ります。Bはその情報を反映して、「Aにダメージを与えた」という事実をなかったことにします。

Bは辻褄の合わない画面表示を一瞬体験することになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/67e9b853-8d47-7f64-4aaa-0e476d0c63d0.png)

こういった場合は、通常、**ユーザーの満足度が多くなる方を採用**します。

> **「損が発生する結果は、損を受ける側の結果を採用。得が発生する結果は得を与える側の結果を採用」
(『オンラインゲームを支える技術』より)**


上記の原則に基づいて、どちらの結果を採用するか考えましょう。

先ほどの格闘ゲームの例であれば、A（損を受ける側）の結果を採用します。もしこれが、例えばマルチプレイ可能なオンラインRPGゲームだった場合、AがBに回復魔法を与える状況ならば、A（徳を与える側）の結果を採用しましょう。

### 関連する問題点その１、「ワープ現象」

上記のように、どちらの結果を取るかという問題の他にも、移動の同期ズレが拡大した場合に、 **「ワープ現象」** という問題が発生します。ワープ現象について、少し詳しく見ていきましょう。

ゲームはプレイヤーの入力に合わせて、あらかじめキャラクターの動きを予測し、キャラクターを動かしています。しかし、実際のプレイヤーの入力とゲームの予想が合わない時に、この「ワープ現象」が起きてしまいます。

例えば、Aがキャラクターを直進させた時、その捜査情報がゲームサーバー側に届きます。次にAがキャラクターの方向転換を行いました。しかし、この時ネットワークの遅延などが原因で、この入力情報がすぐにはゲームサーバーに届かなかったとします。

この場合、ゲームサーバー側は、新しいデータが届くまでは直前の「直進の入力」から、キャラクターの移動方向と速度から予測してキャラクターを動かし続けます。しかし、遅れて受信したAの情報が「方向転換するための入力」と「実際のキャラクターの位置」だった場合、ゲームサーバー側で予測していたAのキャラクターの位置と、受信した「実際のキャラクターの位置」が異なってしまいます。Aの情報が正しいものとして扱うので、ゲームサーバー側はAから受信した情報でキャラクター位置の上書きを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36899/a91f6ccf-19cc-3b7f-2b4f-d9ffc1b2a061.png)


これが「ワープ現象」の原因です。「ワープ現象」が起きた際、キャラクターがあるべき場所から突然、別の場所へと移動するように見えます。他のプレイヤーから見ると、Aのキャラクターが瞬間移動したかのように感じられることがあります。

遅延の時間が大きければ大きいほど、「ワープ現象」は目立つようになります。

<br>

### 関連する問題点その２、「アイテムデュープ」

非同期式によるもう一つの問題として、**「アイテムデュープ」（アイテムの不正複製）** が挙げられます。

これはプレイヤー間の通信遅延を利用して、本来は一度しか使用できないはずのアイテムを複数回使用できる状態を生じさせる現象です。

非同期式のシステムでは、プレイヤーの行動がリアルタイムで他のプレイヤーに反映されるわけではありません。例えば、プレイヤーAが特定のアイテムを使用した後、その情報がサーバーへ送信される前にゲームを終了または再接続することで、サーバー上ではアイテムが使用されたという記録が、更新されないことがあります。その結果、ゲームに再ログインした際には、アイテムが依然としてプレイヤーのインベントリ内に存在しているように見えることがあります。

このようなズレを利用すると、実際には1つのアイテムを複数回使用することが可能になり、ゲームのバランスを崩す原因となります。これは特に、アイテムの価値が高く、ゲームの進行や競争に大きな影響を与える場合に問題となります。

対策として、アイテムの使用とインベントリの更新をサーバーと同期させ、アイテム使用の確認をサーバー側で行うことが重要です。また、プレイヤーが予期せぬタイミングでゲームを終了または再接続した際にも、すべてのデータが正確にサーバー側へ記録されるようにする必要があります。

これにより、アイテムデュープを防ぎ、ゲームの公平性を保つことができます。

<br>

# まとめ

前編では、オンラインアクションゲーム開発において知っておくべきことや、その課題について掘り下げてみました。遅延や同期ズレなど、ネットワーク特有の課題を理解した上で、それに対処する仕組みを設計することが非常に重要です。今回は、非同期型の基礎やその課題に焦点を当て、ゲーム開発者が直面する典型的な問題について解説しました。

次回の後編では、同期型の仕組みやC/S、P2Pのモデル、さらにリレーサーバの役割について掘り下げていきます。本記事で得た知識を踏まえて、ぜひ後編もお読みいただければ嬉しいです。

# 参考

- 「オンラインゲームを支える技術」（技術書）
- [通信同期の技術について](http://blog.opuwr.ganbarion.co.jp/?eid=6)
- [セガ節政氏、オンラインゲームの実装テクニックをレクチャー「バーチャファイター」から「PSU」まで、ネットワークプログラムの実例を紹介](https://game.watch.impress.co.jp/docs/news/391007.html)
- [ラグの対策【基本編】](https://squid-ink-cafe.com/lag/basic/003.html)
- [オンラインゲームの仕組みと工夫](https://www.slideshare.net/imaifactory/ss-48388661)
- [[CEDEC 2010]ネットゲームの裏で何が起こっているのか。ネットワークエンジニアから見た，ゲームデザインの大原則](https://www.4gamer.net/games/105/G010549/20100905002/)