kidoOooOoooOOom

IT系で開発やってます

オンラインゲームを支える技術 第0章 基礎編 その1

転職をして、昔から憧れていたゲーム開発に携われるようになりました。
というわけで今は勉強のため、「オンラインゲームを支える技術」を読み進めています。
ページ数も多く、内容も濃いので少しずつブログにメモっていくことにします。

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

オンラインゲームを支える技術  ??壮大なプレイ空間の舞台裏 (WEB+DB PRESS plus)

【第0章 [速習]オンラインゲームプログラミング】
オンラインゲームを実装するためには、以下の2大スキルが必要!

  1. ネットワークプログラミング
  2. ゲームプログラミング
  • ネットワークプログラミング

OSI参照モデルTCP/IPは是非とも理解しておきましょう。
また、オンラインゲームにおいてはレイヤ5やレイヤ6におけるデファクトスタンダードで入れ替え可能なプロトコルがまだ存在していないため、一般的にレイヤ5以上はすべてオンラインゲームの開発者で実装する必要があるようです。

  • C/S型ゲームとP2P型ゲームとの特性の違いについて
  • C/S型ゲーム
    1. 小帯域:毎秒数回〜20回程度、数百バイトまでの通信を続ける接続を、
    2. 超多数:1サーバあたり数千〜数万の接続を維持したまま、
    3. 低遅延:数ミリ秒〜20ミリ秒以内の遅延で処理を行い、結果を返す
    4. ステートフル:サーバは状態を持っており、敵などの可動物が多数リアルタイムにオンメモリ動作を続けている
  • P2P型ゲーム
    1. 小帯域:毎秒数回〜20回程度、数百バイトまでの通信を続ける接続を、
    2. 小数:1クライアントあたり数本まで、
    3. 低遅延:数ミリ秒〜20ミリ秒以内の遅延で処理を行い、結果を返す
    4. ステートフル:クライアントは状態を持っており、敵などの可動物が多数リアルタイムにオンメモリ動作を続けている。また画面描画などの非常に重い処理も同時に行う必要がある。
    5. 多様性:クライアントのネットワーク状況の多様性に対応できなければならない

オンラインゲームではリアルタイム性や快適な操作性が求められるので、低遅延ってところがポイントになりそうです。折角の面白いゲームでも、読み込みが頻繁にあったり遅延が多々発生するとやる気を無くしています。

  • ソケットプログラミング入門

IPでは、通信路の端点は1つのIPアドレスと1つのポート番号の組で特定します。よく使われる既知のポート番号については、IANAのポート番号表に掲載されています。
http://www.iana.org/assignments/port-numbers
※ 本書の通り、MMORPGの WoW(World of Warcraft) のポート番号も本当に載ってる・・・。


ソケットプログラミングについて、ソケットAPI擬似コードを用いての説明が載っています。TCP通信路の状態遷移については、下記サイトの図が分かりやすいですね。
基礎から学ぶWindowsネットワーク 2.TCPの状態遷移図

  • 複数クライアントに対するソケットプログラミングについて

同時接続数3000とかが普通にあり得るオンラインゲームの世界では、接続の度にスレッドを生成するマルチスレッド方式では3000スレッドとか立ち上がってコンテキストスイッチだけでCPUがあっぷあっぷになってしまいかねません。よってオンラインゲームの世界ではクライアントでもサーバでも通常、シングルスレッドでポーリングを用いたごく単純なイベント駆動のノンブロッキング実装を使うのが基本だそうです。
なるほど。

  • オンラインゲームと実装言語

実装言語については、オンラインゲームのサーバにおいて最も使われるのはC/C++で、次いでJava, それ以外と続くようです。

  • 性能の最大化&開発効率向上

開発効率を高めるためにもガーベッジコレクションを有するJavaC#、あるいは軽量言語を使えないかと各社で検討も進められているようです。しかし現状では、サーバの最高性能を引き出すためにC/C++で書くのが最も適しており、開発効率と性能との間でトレードオフがあります。

  • オンラインゲーム特有の理由による言語の性能差

言語とスループットに関して以下のような表を載せています。

言語 スループット 特性
C/C++ 100 静的言語、ネイティブコード
Java 1〜10 静的言語、VM、ネイティブコード
Ruby, Python 0.1〜1 動的言語

JavaC/C++の間で10倍もスループットに差があるのはオンラインゲームに特有だそうです。JITコンパイラの進化もありJavaとCでそんなに性能差を気にしなくてよくなってはきましたが、オンラインゲームのようにOSの入出力を頻繁に行う(システムコールを頻繁に呼び出す)アプリケーションではまだまだ性能差があるようです。


とりあえず今日はここまで。