ITエンジニア

ゲームプログラマは超優秀!ドラゴンクエスト開発に共感した話

スクエアエニックス

みなさんはドラゴンクエストというRPGゲームを知っていると思います。よく知らないまでも聞いたことくらいは絶対にあるほど有名な国民的ゲームですが、裏側の仕組みまで知っている人はなかなかいないでしょう。今回はそんなドラゴンクエストについて書きます。

ドラゴンクエストについて

ドラゴンクエストは本編シリーズ一作目が1986年にエニックス社(スクウェア社と合併し現在はスクウェアエニックス)からファミコン用RPGゲームとして発売され、現在は11作目までリリースされている国民的ゲームです。今回は本編シリーズ10作目にして初のオンライン化を果たした「ドラゴンクエストX」について勉強しました。

ドラゴンクエストX オンライン | 新しい冒険の舞台が広がり続ける“終わらないドラクエ”
皆をつないで世界がつながる。『ドラゴンクエストX オンライン』の最新情報をお届けするプロモーションサイトです。
りんりん
りんりん

ちなみにドラゴンクエストXをプレイしたことはない...

ドラゴンクエストXを支える技術

勉強したといっても本を一冊読んだだけなのですが、これがとても面白かったです。

大規模オンラインRPGの舞台裏 (WEB+DB PRESSプラスシリーズ)

本書にはドラゴンクエストシリーズの歴史についてやドラゴンクエストXの開発と運営の体制、システムのアーキテクチャなどサービス内部のことがわかりやすく図や画像付きで書かれています。

システム面で言えばドラゴンクエストXのようなオンラインゲームも私が携わっているWebサービスも似たようなものだと思っています。ですがオンラインゲームはユーザのバーチャル体験を価値として提供することに対し、Webサービスはユーザの生活を便利にするツールであることが大きく違い、それがサービスのデザインや世界観にも及んでいるように感じました。

アーキテクチャ

ドラゴンクエストXはクライアント/サーバ型のオンラインゲームで、通信方式にはVceというスクウェアエニックス社オリジナルのプロトコルを使用しています。クライアントにはWindowsWii UNintendo SwitchPlayStation4など家庭用ゲーム機を含めサポートしています。サーバではインフラのほとんどはオンプレミスで一部AWS(S3LambdaSQS)を利用しています。またそれらとは別にゲーム連動サービスとして、Webサイト運営やニンテンドーDS、スマートフォンアプリでもサービスが提供されています。

以下はゲーム連動サービスの「目覚めし冒険者の広場」です。運営側からのお知らせやプレイヤー情報を閲覧したりすることができるドラゴンクエストXのポータルサイトです。

ドラゴンクエストX - 目覚めし冒険者の広場
「ドラゴンクエストX」のプレイヤー専用サイト、「ドラゴンクエストX 目覚めし冒険者の広場」

主要プログラミング言語にはC++が採用されています。実行速度の観点からゲーム業界では主流言語のようです。その他部分的にはLuaを使用し、ゲーム連動サービスにJava、社内ツールにC#を使用してます。

りんりん
りんりん

C++はC言語を拡張したプログラミング言語で、CPUネイティブコードにコンパイルして実行ファイルを作るんだ。PHPやJavaのようなインタプリタを通したり都度コンパイル実行する言語に比べ、実行時のオーバーヘッドが小さいから高速に動くんだね。けどコンパイルは遅いしプラットフォーム毎にビルド環境が違うから開発効率は悪くなるんだ。

心臓部となるデータベースにはOracle Exadataを導入していて、補助の役割でKVSも使用しています。

私が携わっているWebサービスでも同じくOracle Exadataを使っていて親近感が湧きました。Oracle ExadataはOracle社が提供する最高グレードのデータベースクラスタで、一番低いスペックでもCPUコア数48、メモリ800GB、ディスク250TBというハイスペックで、導入には3000万円以上かかります。

私の共感ポイント

私はオンラインゲームのことは詳しくはわかりませんが、書籍の中で私の業務にも通じる部分や比較して面白いと思ったポイントがいくつかありました。

メモリ管理

ドラゴンクエストXのクライアントは主に家庭用ゲーム機になります。それらに搭載されるメモリやストレージは比較的小さく、拡張ができない上にグラフィックス描画のような高負荷処理が求められるため、メモリ節約を念頭においた設計を行います。特に問題となったのがメモリフラグメントで、確保するメモリサイズや開放のタイミングを入念に検討して断片化が起きないように努めたそうです。

私も仕事でC++プログラムを書くことがありますが、サーバーサイドでの利用なので、リソース不足によるパフォーマンス劣化はリソースの拡張やサーバ増設で問題を回避することができてしまいます。しかしクライアントではそうはいかず、できるだけ効率よくリソースを使わなければなりません。そうなると低レイヤの知見が自ずと必要となるので、ゲーム業界には優秀なプログラマが集っていることでしょう。

データ管理

オンラインサービスとしてパフォーマンスのボトルネックとなることの多いデータベースですが、Oracle Exadataを導入しているからといって油断はできません。ドラゴンクエストXともなればユーザ数は数十万人にもなり、ユーザ数に比例してデータ量も大きくなりますしアクティブユーザの数だけデータベースへの接続も増えます。なので増え続けるデータや接続によるパフォーマンス劣化に常に立ち向かわなければいけません。

ドラゴンクエストXではデータ単位に同期の要否を検討し、同期が不要なデータはKVSに保存する方式をとってOracle ExadataへのI/Oを低減しています。

前述しましたが、私のチームでもOracle Exadataを扱っていて、ユーザ離れにつながるパフォーマンス劣化には常に注意しています。しかしOracle Exadata以前にRDBの設計は難しく、また日々変わるサービス仕様にも追従していかなければなりません。そうした運用の中徐々に拡大するパフォーマンス劣化にシビアに向かう必要がありますが、リアルタイム性を求められるオンラインゲームに比べると、課題感は低いように感じました。

画像アップロード

ドラゴンクエストXではプレイ時にキャプチャした画像をゲーム連動サービスの「目覚めし冒険者の広場」で閲覧することができます。

開発当初は画像サーバを設け、クライアントからHTTPでのアップロードを受け付け、リサイズなどの加工処理を行いストレージに保存、その後にクライアントに応答を返すようにしていました。しかしベータテスト中に画像サーバが画像加工プロセスで高負荷になっていることに気付き対策をすることとなるのです。

そして検討した結果、負荷のかかる画像加工プロセスをAWSに切り出し課題解決を図ります。アップロードを受け付けたら画像は加工せずにそのままS3にアップロードしてクライアントに応答を返します。AWS側ではLambdaで画像加工を行いSQSに保存、その後画像サーバがSQSのキューデータを取得し画像ストレージに保存するよう改善したのです。

旧方式

  1. 画像サーバがクライアントから画像を受信
  2. 画像サーバで画像加工
  3. 画像ストレージに保存
  4. クライアントにレスポンス返却

新方式

  1. 画像サーバがクライアントから画像を受信
  2. 画像サーバがS3にアップロード
  3. クライアントにレスポンス返却
  4. 2.の後LambdaでS3の画像を加工
  5. SQSにキューデータとして画像を保存
  6. 画像サーバがSQSのキューデータを取得
  7. 画像ストレージに保存

私が携わっているのはECサイトなので、商品の画像アップロードが頻繁に発生します。外部サービスは利用していませんが、やはり画像加工プロセスは非同期にしてユーザとは切り離して処理しています。画像アップロードに関しても通じるものを感じました。

おわりに

今回はほんの一部分の感想を書きましたが、書籍にはWebサービスにはないキャラクター移動やグラフィックス描画の仕組み、開発運営の苦難などについて詳しく書かれています。ドラクエ好きなエンジニアは必ず読んでおくべきでしょう。

ゲーム業界は流行り廃れが激しく、求められる技術の高さもこの書籍を読めばおわかりいただけると思います。プログラマとして成長したいなら、ゲーム業界に進むのが効率良いかもしれません。

コメント

  1. […] […]

タイトルとURLをコピーしました