大規模ゲーム開発で存在感を高めるErlang/Elixir ─ Nintendo Switch™とロマサガRSの事例から

大規模なゲーム開発で、プログラミング言語Erlang/Elixirの存在感が増しています。Nintendo SwitchのErlang活用事例と、ロマサガRSにおけるElixirの導入事例について、アカツキ島崎清山さんに解説してもらいました。

大規模ゲーム開発で存在感を高めるErlang/Elixir ─ Nintendo Switch™とロマサガRSの事例から

2019年6月1日、永田町JA共済ビルにて、Erlang & Elixir Fest 2019が開催されました。Erlang/Elixirを利用する開発者らを集めて国内で開催されるメインイベントとしては、2017年のElixir Conf Japanから数えて、今年で3回目を迎えたことになります。

Erlang & Elixir Fest 2019

参加費6,000円の一般枠が事前登録で埋まり、当日の来場者も150人を超えたErlang & Elixir Fest 2019は、過去2回にも増してErlang/Elixirの可能性を強く感じさせるイベントとなりました。セッションも全体を通して多彩でしたが、中でも目を引いたのは、ゲーム開発における存在感でしょう。

基調講演では、Nintendo Switch向けのプッシュ通知システムNPNS(Nintendo Push Notification Service)で、Erlang製のメッセージングサーバejabberdがどのように活用されているかが、任天堂の渡邉大洋さんにより紹介されました。

また、アカツキの梶原星平さんと関山友輝さんからは、スクウェア・エニックスの配信ゲーム「ロマンシング サガ リ・ユニバース」(ロマサガRS)における実践的なElixirの導入事例が語られました。

なぜ、こういったゲーム開発、それもユーザ数が数百万から数千万を超えるような大規模なゲーム開発において、Erlang/Elixirが選ばれるのでしょうか?

Erlang & Elixir Festを主催するJapan Elixir Associationの代表であり、アカツキでロマサガRSにおけるElixir導入にも関わった島崎清山さんへの取材を通して、ゲーム開発の現場でErlang/Elixirが選択される理由を探ります。

1

島崎 清山(しまざき・せいざん) 2seizans 3seizans
株式会社アカツキ モバイルゲーム事業部 テクニカルディレクター/クリエイティブプロデューサー。東京工業大学を卒業後、エン・ジャパン、時雨堂などを経て、2016年より現職。一般社団法人Japan Elixir Association代表理事としてプログラミング言語Elixirの日本カンファレンスを主催。

そもそもErlang/Elixirとは

そもそもErlang/Elixirとは、どのようなプログラミング言語なのでしょう。まずはっきりさせる必要があるのは、「Elixir」と「Erlang」の2つは、それぞれ別々のプログラミング言語だということです。では、なぜErlang/Elixirと併記して語られるのでしょうか?

堅牢さと並行性を兼ね備えたErlang

Erlangは、スウェーデンの通信機器メーカーであるエリクソンのもと、計算機科学者のジョー・アームストロング(Joe Armstrong)らによって開発された言語です。

4Erlang Programming Language

通信アプリケーションの開発を目的としていることから、プログラミング言語のレベルで堅牢性と並行性を実現しやすいように設計されているのが特徴です。その歴史は1986年にまで遡りますが、現在でもWhatsAppやLINEなど、有名なネットワークサービスの裏側で利用されています。

Erlangのコードは、当初はProlog製のインタプリタで実行されていました。しかし、実用性の問題から、コンパイルして仮想マシンで実行する仕組みが1992年に開発されます。このErlang VM(Erlang用の仮想マシン)上で動作する、Erlangとは別の新しい言語として2012年に誕生したのが、Elixirです。

5Elixir

つまり、ElixirとErlangの関係は、仮想マシンを利用する別の言語という意味で、KotlinとJavaの関係に似ています。KotlinがJavaと完全に相互運用が可能であるように、ElixirからもErlangの力を完全に利用できます。Elixirもまた、Erlangと同様の堅牢性と並行性を兼ね備えているということです。

幅広い現場で受け入れられたElixir

Elixirを開発したジョゼ・バリム(José Valim)は、Ruby on Railsのコミッタだったこともあり、Rubyに似た構文でErlangの長所を備えた言語として、Elixirを開発したと言われています。

ジョゼはさらに、パイプ演算子、メタプログラミングのためのマクロなど、主にWebアプリケーションの開発で生産性に寄与するさまざまな機能を、Elixirに取り入れました。その結果、Erlangの堅牢性や並行性に魅力を感じながらも採用に踏み切れないでいた開発の現場でも、Elixirは広く受け入れられるようになります。

実際、島崎さんは「アカツキにおいて、Erlangを採用するのは現実的ではなかった」と言います。アカツキはもともとRubyの開発者を多く擁していたため、Elixirがあったからこそ会社として採用に踏み切れたというわけです。

世界中で利用されるゲーマー向けのチャットシステムのDiscordでも、より現代的かつ開発者への負担が少ない形でErlang VMを活用できる言語として、当初からElixirが採用されています。

6How Discord Scaled Elixir to 5,000,000 Concurrent Users

日本におけるElixir開発者コミュニティの始まり

島崎さんによると、アカツキがロマサガRSでElixirの採用を決めたのは2017年のことでした。その前年にあたる2016年ころから、アカツキだけでなくドリコムやmixiでも、自社サービスやゲーム開発にElixirを本番投入することを検討していたようです。

それと同時に、それに伴うリスクの受け皿として開発者コミュニティの必要性が各社の間で意識されるようになり、ドリコムの大原常徳さんが主体となって、「tokyo.ex」というElixirコミュニティが活動を開始しました(大原さんが執筆したElixirの解説が関連記事の欄にあります)

さらに、Elixirをプログラミング言語として広めることを目的として、前述のElixir Conf Japanが参加者300人という規模で開催されました。このときは、Elixirの生みの親であるジョゼも来日して、基調講演を行っています。

ロマサガRSの裏側を支えるElixir

アカツキが開発に携わるロマサガRSでは、バトルの計算処理を含め、ゲームロジックの計算をクライアント側ではなく全てElixir製のサーバ側で処理しています。この設計は、主にチート対策が目的で、ビジネス上の要請によるものでした。

アカツキでは、当初、クライアント側でロジックの計算を実施するという設計も検討されていたそうです。しかし、島崎さんは「クライアントでロジックを実装してしまうことでチートが可能になると、真剣にプレイしていただくファンの方々が離れていってしまう」と考え、サーバ側でゲームロジックを処理することを提案しました。

この提案の鍵となったのが、Elixirの実用性と生産性です。

Erlang VM上で動作することによるElixirの実用性

実用性に関しては、Erlang VM上で動作することによる強みが、Elixirにも当てはまります。

例えば、ElixirにはErlang VMの軽量プロセスを使ったTaskという仕組みがあり、これをボイラープレート的に使って関数を呼ぶだけで、その関数を非同期に実行できます。これと似た処理を、例えばRuby on Railsで実現するには、Redisのキューに入れて背後のバッチサーバで動かすといった仕組みを導入することが多いでしょう。

ロマサガRSでは、この仕組みを利用して、一部の処理をオフロードしています。Erlang VMの処理速度に加え、こういった処理も一因となって、結果的に平均50msという速さでレスポンスを返せているとのことです。「レスポンスの速さはゲームのプレイ体験に大きく寄与してくれた」と島崎さんは考えています。

また、ETS(Erlang Term Storage)というErlangのオンメモリデータベースも活用されています。具体的には、「技の強さ」のようなゲームにおけるマスタデータはRDBから取り出すのでなく、起動時にETSへ読み込んで、高速に取り出せるようになっています。

ユーザデータの格納にはRDBが利用されていますが、この面でもElixirを採用したことによる利点があったそうです。同様のサーバをRuby on Railsで構成した場合と比べると、コネクション数が数分の一に減り、「おかげでAmazon Auroraの負荷が減り、コネクション数の上限値も気にしなくて済むようになった」と言います。

ロマサガRSがElixirによって手に入れたチーム開発の「生産性」

これら実用的な機能に加えて、ロマサガRSの開発でElixirが大きく寄与したというのが、「品質の高いコードをチームで維持、共有する」ことによる生産性の側面です。

「ロマサガは、従来からシステムが複雑で奥深いことが、ゲームとしての面白さのひとつだった」という島崎さんは、ロマサガRSの開発当初から、その面白さを運営型ゲームで損なわないために、コード品質を保つことが極めて重要であると考えていたそうです。

生産性に関して島崎さんがまず挙げるのは、チーム開発における高密度かつ簡潔なコードの価値です。

例えば、Elixirに限らず多くの関数型言語が備えるパターンマッチをうまく使うことで、分岐処理の見通しがよくなります。また、Elixirのパイプ演算子を使って複数の処理をつなげるイディオムを活用すれば、一時変数を大きく減らすことができ、コード密度が上がります。こうした構文は、多くの処理を次々とつなげるゲームのバトルロジックを簡潔に保つのにうってつけです。

チームで同一のコードを開発していると、コードのスタイルに迷ったり、それについての議論が始まったりすることもよくあります。Elixirには標準でコードフォーマッタが備わっていることから、こうした「自転車置き場の屋根の色」をめぐる議論を避けられたことも、チーム開発における生産性向上には有効だったといいます。

ロマサガRSの開発にElixirがもたらした生産性の鍵として、島崎さんがもうひとつ挙げるのは、コンパイル時解析1や型検査ツール2の存在です。テストに加え、これらをCircle CIによる継続的インテグレーションに組み込んだことで、大胆なリファクタリングが可能になりました。

そのおかげで、納期との戦いでコード品質が犠牲になりがちな開発後期から終盤にかけても、迅速にパフォーマンスチューニングを施すことができ、ゲームで遊ぶユーザにとっても処理時間の高速化という利益を提供できたと言います。

さらに、リリース後の機能修正や追加においても、開発速度を維持し続けられているとのことです。

Nintendo Switchのプッシュ通知システムを支えるErlang

エンジニアHubに会員登録すると
続きをお読みいただけます(無料)。
登録のメリット
  • すべての過去記事を読める
  • 過去のウェビナー動画を
    視聴できる
  • 企業やエージェントから
    スカウトが届く