サーバサイドからクライアント、ツールまで、Node.jsを利用
DeNAでは、スマートフォン向けのソーシャルゲーム開発プラットフォームとして、クライアントアプリ開発用のゲームエンジン「ngCore」(ngCore Client)、開発ツールの「ngBuilder」(ngGoBuilder)を提供しており、ソーシャルゲームのサーバサイド実装をサポートする「ngServer」を現在開発中だ。
ngCoreでは開発時におけるデバイスへの配信サーバとしてNode.jsが使われており、ngBuilderでもNode.jsを利用。そして、ngServerはNode.jsをベースとしたサーバサイドフレームワークだ。Node.jsを採用している理由として、篠崎氏はまず「より多くの接続数に対処できること」を挙げた。
「特にスマートフォン向けのソーシャルゲームでは、リアルタイムの要求が増加し、いわゆるC10K問題が現実味を帯びてきている。そのため、大量の同時接続を処理するうえで十分なパフォーマンスを発揮できることが重要なポイント」
ほかにも、Node.jsはメモリ使用効率に優れており、「スレッドを使ったサーバプログラムと比較すると、かなり有効にメモリ資源を使えている」という。
すでにNode.jsのサーバを使ってサービスを展開しているMobageのソーシャルゲームとして、篠崎氏は「SKYFALL」と「VIP LIFE」の2つを紹介。これらはDeNAのグループ会社である米国ngmoco社のタイトルで、米国のAndroidマーケットなどでベータ公開されている。
これらのゲームの開発では、Node.jsのバージョンアップが早すぎる、モジュールのアップデートについていけないといったように、Node.jsを採用したことに起因する問題にも直面した。中でも一番苦労したのが、CPUスパイクの問題だという。
「一定の負荷がかかった状態で運用していると、いつの間にかCPUスパイクが発生するようになってしまった。なかなかその原因が特定できなかったが、最終的にはNode.js自体の問題であることが分かった」(篠崎氏)
その根本的な原因は、Node.jsが採用するJavaScriptエンジン「V8」のGC(ガベージコレクション)で、大きなヒープメモリが確保されたときに同様の問題が起きていたそうだ。Node.jsはV8のアップデートを取り込んでいくため、もし新バージョンのV8に未知のウイークポイントがあれば、そのままNode.jsにも取り込まれてしまう。プロダクションのサーバでは、Node.jsのリリースバージョンを使うのか、あるいはカスタマイズのバージョンで運用するのかなど、検討したうえで自社の方針を決断する必要があるだろう。
こうした経験をもとに開発されたサーバサイドフレームワークが、ngServerだ。篠崎氏は、「奇をてらわないスタンダードな構成」としながら、図1のアーキテクチャを紹介。デバイス(スマートフォン)からJSONが送られると、ngServerのコントローラはJSONを返す。デバイス側はそれをもとに、デバイス上でレンダリングを行う。従来の携帯電話(フィーチャーフォン)のソーシャルゲームのように、サーバからデバイスにswfファイルやレンダリングされたHTMLファイル、イメージなどが送信されることはなく、やりとりされるのはJSONのみとすることでNode.jsの強みを最大限に活かす仕組みだ。
なお、ngCoreはもともと米国サンフランシスコに拠点を置くngmoco社の技術であり、ngServerのプロジェクトも基本的に東京-サンフランシスコ間での共同開発で進められている。篠崎氏は最後に、この開発体制についても紹介。距離や時差など共同開発における課題は多いが、篠崎氏が最も留意しているのは、アメリカ人と日本人との「気質の違い」だという。
例えばレビューなどで、日本人は「問題がある」「バグ」「ひどい」「動かない」など、否定的な表現から入る場合が多いが、アメリカ人は「すばらしい」「すごい」「これいいね」といった言葉の後に、「ところで提案だけど……」と意見を述べる。
「こちらもポジティブな言葉や、いわゆる褒め言葉を使ったほうが、明らかに意思疎通もうまくいく。それが信頼関係にもプラスに作用することを、身をもって学んだ」(篠崎氏)
ゲーム開発にかかわるすべての人に快適な環境を提供するために
続いて登壇した能登氏は、ngCoreで利用するライブラリおよび開発ツールについて紹介。DeNAでは、これまで提供してきたライブラリ「ngGo」と開発ツール「ngBuilder」を1つに統合し、「ngGoBuilder」として提供するために準備を進めているという。
ngGoは、さまざまなタイプのゲーム開発で使える機能を備えている。例えば、レイヤー別にスクロール画像をセットできる機能を使えば、横スクロールでキャラクターと手前の背景、後ろの背景などが別々に(多段で)動いていくようなゲームを効率的に開発可能だ。また、スマートフォンの実機上で、任意のシーンにすぐ移動してデバッグしたり、ユニットテストを動かせるような機能も提供している。
一方、ngBuilderは、iOSやAndroidのシミュレータ、プロファイラなどを提供。それぞれ、ngCoreによるゲーム開発を便利にするライブラリ/ツール群として、リリース以来、多くのゲーム開発者に利用されてきた。
しかし、ngCoreの開発環境全体として改善すべき点も出てきたと、能登氏は説明する。
「例えば、ngCore自体の再起動にかかる時間が長いため、イテレーションの際にストレスを感じるという声があった。また、ngCoreのセットアップも結構難しい。こうした中で、ngBuilder、ngGoの開発チームでは、今までとは違った視点で改善に取り組む必要があると感じるようになった」
今までとは違った視点とは、「ゲームを作る過程をもっと楽しいものにする」というものだ。特にゲーム開発では、通常のWebアプリケーションなどに比べて、アニメーターやグラフィックデザイナー、レベルデザイナー(ステージごとの難易度、強さなどをデザインする役割)、企画者など、エンジニア以外の関係者も多い。そういった人たちの作業を手助けするツールも必要となってきた。
それを実現するために、新たな機能を取り込むと同時にngGoとngBuilderを1つにまとめ、新たに「ngGoBuilder」として提供することになったというわけだ。
「これまで、アニメーションやグラフィックの修正などをゲームに反映するために、シニアエンジニアが“ハブ”の役割を果たさなければならないケースが多かった。シニアエンジニアはその作業に忙殺されて、本来の技術的なレビューや設計に十分な時間を使えない。アニメーターの方だって、自分で作ったアニメーションを、いちいちエンジニアに頼まずに自分でゲームに反映して、すぐに確認したい。ngGoBuilderがこのハブの役割を担えるようになれば、ゲーム開発はもっとスムーズにできるはず」(能登氏)
開発中のプレビュー版のデモからも、面倒な設定なしにボタン1つだけでngCoreの動作確認が行えるなど、より簡単に操作できるようになったことがうかがえた。もちろん、エンジニアにとっての使い勝手も向上しており、例えば、iOSシミュレータとJavaScriptデバッガを組み合わせて使えたり、JavaScriptエディタで容易にコードを確認できるようになっている。
能登氏によれば、「ngBuilder 2.0」は近日リリース予定(後日2/27にpreview版がリリース済み)。そして、その次のバージョン2.1でライブラリ(ngGo)と開発ツール(ngBuilder)が完全に統合されngGoBuilderという名前になるという。
続いては能登氏も、サンフランシスコngmoco社との共同開発について触れた。やはり17時間の時差は大きく、リアルタイムで連絡の取れるタイミングがかなり限定されるようだ。
「我々が9時に動き始めると、向こうはもう16時。19時までの稼働として、そこから残された時間は3時間程度しかない。日本時間のちょうど午前中いっぱいが本当に貴重な時間となっている」(能登)
この限られた時間を最大限活かすために、能登氏は毎朝9時にGoogle+のハングアウト(ビデオチャット)を使い、サンフランシスコ側のプロジェクトリーダーとフェイス・トゥ・フェイスでコミュニケーションをとっているという。
「3時間しかない中で何ができるのか、試行錯誤しながらノウハウを蓄積している。グローバルな共同開発の場で、全員にとってベストに機能するような独自のチームカルチャーを作っていくのは、とても楽しいチャレンジでもある」と能登氏は最後に述べ、セッションを締めくくった。