ゲームサーバー勉強会。記録的な寒波にみまわれた2014年2月8日にスタートした、日本では珍しいゲームサーバーの勉強会コミュニティです。ユニークなのはエンジニアだけでなく、ゲームサーバーの仕組みやノウハウについて興味があるゲームデザイナー向けの内容も含んでいること。実際、急速に成長したソーシャルゲームを安心・安全・堅牢に運営しつつ、おもしろいゲームをリリースするためには、サーバエンジニアとクライアントエンジニア、そしてゲームデザイナーの連携が欠かせません。ゲーム業界ならではの分野横断型コミュニティだといえます。
そんなゲームサーバー勉強会がこのたび、IGDA日本のSIG-NetworkSystemとして再スタートを切り、2017年11月25日に都合7回目の勉強会を開催しました。当日は「イケメンシリーズでのORMとスロークエリ対策について」「PHPからJavaで乗り換えた。そんな昔話をしよう」「難易度ボラタリティグラフという分析手法」という3つの講演を実施。前半2つはエンジニア向け、最後の1つは運営チームのゲームデザイナーにも参考になる内容となりました。終了後は会場でビアバッシュも実施し、参加者同士が思い思いに交流。資料はすべてWebで公開済みですので、本文とあわせてご覧ください。
負荷対策の基本は「計測」に基づく「対策」にあり
サーバーが重くて遊びにくい。最悪の場合、サーバーが落ちてしまう……。初期のオンラインゲーム(そしてフィーチャーフォンのソーシャルゲーム)では、しばしばこうした事態に陥ることがありました。サーバエンジニアにとっては悪夢のような状況です。厄介なのは人気ゲームほどアクセスが集中し、トラブルになりやすいこと。「イケメンシリーズ」など女性向けの人気コンテンツで知られるサイバードで、サーバエンジニアのとりまとめを行っている伊藤雅俊氏は、同社でどのようなスロークエリ対策(=サーバのレスポンス改善)を行っているかについて解説しました。
2012年6月にリリースされた「イケメン大奥◆恋の園」から、最新作「イケメンヴァンパイア◆偉人達と恋の誘惑」まで、5年間で13本のアプリが登場した「イケメンシリーズ」。同社では他にサッカークラブ運営ゲーム「BFBチャンピオンズ2.0」など、さまざまなコンテンツを展開中です。そんな同社「イケメンシリーズ」のシステム構成は、オーソドックスなLAMP環境。DB(データベース)の使い方も基本に忠実だといいます。サーバー環境も初期はクラウド(IIJ/AWS)、中期はオンプレミスと、状況にあわせて使い分けており、最新作では再びAWSに戻ってきたと説明されました。
これにあわせて、同社ではDBチーム内に全社横断型の監視チーム「スロークエリ道場」を2015年9月に立ち上げました。モニタリングツールのMonyogと内製ツールを併用しながら、DBにおけるスロークエリの状況を毎週、運営チームに報告するのがミッションです。その結果、当初は閾値10秒でも1日で数百件のスロークエリが発生していたものが、昨今では閾値0.5秒でも1日数件と、劇的に改善されました。「道場側でスロークエリの指摘を行っても、繁忙期だと対策が後手に回ることもあった。そうした場合でも、技術部側のリードエンジニアを巻きこむなどして、徐々に対応していった」(伊藤氏)といいます。
他にDB負荷対策もかねて、新技術のリサーチを常に続けているとのこと。過去の事例では超高速半導体ストレージ「Fusion-io」を搭載したDBサーバーを導入すると共に、オンプレミス環境に移行した際、劇的な改善が見られたと振り返りました。近年の新技術ではGoogle Cloud Spannerに注目しているとのことです。このように伊藤氏は「負荷対策の基本は『計測』に基づく『対策』にある」と指摘した上で、新技術の導入や既存のテクニックと組み合わせつつ、ユーザーに快適なゲーム体験を提供していきたいとまとめました。
PHPからJavaに乗り換えて効率アップ!
現在は「ユニティの中の人」として、テクニカルサポートを行っている黒川優介氏。しかし、過去にゲームメーカーでモバイルゲームのAPIサーバー開発を担当していた時期がありました。当時の案件で、プロトタイプではPHP5系の言語を使って開発されていたものを、本制作はサーバサイドJava(tomcat6)に切り替えたところ、開発効率が上がったことがあったといいます。もっとも、Javaならではの注意点があったことも事実。黒川氏は当時の経験をふり返りながら、サーバエンジニアから見たPHPに対するJavaの優位性と、導入の工夫について講演しました。
クライアント(スマホ端末)とDBサーバーの仲介役として、さまざまな処理をこなすAPIサーバー。当時担当した案件では、APIサーバーをプログラムする上で、「過去にPHPでWebサービスの開発経験があったし、PHPがトレンドらしいので」と、明確な理由もないまま、PHPでの実装を決めたと言います。しかし、「PHPよりJavaのプログラマーが多い部署だった」などの理由から、開発途中でJavaによる実装に切り替えることに。上司からの提案でしたが、結論から言うと、これが大正解だったと言います。「実際、次のプロジェクトでもJavaを採用したくらいです」(黒川氏)
黒川氏はPHPに対するJavaの優位性として、「Javaはコンパイル後にサーバーに実装するため、構文が間違っているとコンパイルエラーが発生する。そのため、最低限の品質保証ができる」「『CheckStyle』『FindBugs』という、2種類の静的解析ツールをJenkinsの自動ビルドに組み込んだことで、コードの品質が向上した」「スレッドベースの特性を生かして、キャッシュサーバなしで運用できた」という3点を上げました。特にPHPではサーバー上でプログラムを実行しなければエラーがわからないため、全体の開発進捗にも影響することもあり、Javaの恩恵が実感できたと言います。
ただし、JavaではDBへのアクセス時に、オブジェクト変数への適応を自分で行う必要があったと、PHPと比較しての課題点も共有されました。PHPでは連想配列にデータを格納できたため、面倒なことを考えなくても、DBからデータをまとめて取得できたとのこと。これがJavaでは項目別にデータを取得して回る必要があり、たいへん面倒に感じられたのです。この問題を黒川氏は「JavaのReflectionを使用すると、DBの項目名からオブジェクトに直接代入ができるようになる。この機能を活用することで回避できた」と指摘。参考にして欲しいと語りました。
そのステージの難易度、合ってますか?
最後に登壇したのは、ゲームデザイナー・プログラマー・半導体計測器開発・機械学習コンサルタント・書籍執筆など、八面六臂の活躍を続ける中山ところてん氏。中山氏は「ソーシャルゲームではデータ分析に基づくゲームバランスの調整が非常に重要だが、実際には手が回らないことも多い」と指摘。そうした中でもサーバエンジニアはデータ分析に必要な生データを直接入手できる立場にあり、データ分析を任される場合も多いため、覚えておいて損はないと語りました。「分析するだけなら、SQL一発でいけることが多いです。アレなディレクターへの対策にもなります(笑)」(中山氏)
中山氏が提案したのは、運用中のゲームデータからダイナミクス(MDAフレームワークにおける「データやアルゴリズムによって発生する現象」のこと)を計測し、統計的な分析手法で可視化する方法論です。具体的にはフロー理論(行為者のスキルとチャレンジの難易度が噛み合っているとき、行為者はそのチャレンジに没頭するという理論)をベースに、ゲーム内資産と勝率でボラタリティグラフを作成し、ステージの難易度が適切か検証するというものです。なお、実際にはプレイヤーの強さには、各々プレイヤースキルと運の要素が加わりますが、定量化できないため、ここでは省略されています。
「難易度ボラタリティグラフを作成することで、ステージの難易度が間接的に計測可能になります。『パズドラ』『モンスト』などのようなステージクリア型のゲームで、プレイヤースキルをゲーム内リソースで補えるようなものであれば、幅広く活用できます」(中山氏)。講演ではボラタリティが大きすぎても、小さすぎてもプレイヤースキルが勝敗に影響しづらく、バランス調整が必要であることが示されました(ボラタリティが大きすぎると、誰でもクリアできる運ゲーになり、小さすぎるとレアカードがなければ勝てない、課金ゲー状態になる)。
また、連続するステージ間で難易度ボラタリティグラフの重複領域を調べれば、ステージ間の難易度上昇が適切か否かも図示できるとしました。ファネル分析(アプリ内でユーザーが離脱するプロセスを可視化するための分析手法)と併用すれば、離脱が多いステージでの改善などにも応用可能になります。ヒートマップを作って可視化すれば、複数ステージのバランス調整が、より的確にできるようにもなるとも補足されました。「これらはログから簡単に分析できるものです。近い将来、AIによるテストプレイが一般化すれば、さらに活用できるのではないでしょうか」(中山氏)。
セミナー冒頭、SIG-NS世話人の望月大作氏は「今後も年に2回程度、セミナーを定期開催していきたい」と抱負を述べました。セミナー登壇者は随時募集中とのことです。詳細はSIG-NS公式サイトをごらんください。(小野憲史)
*難易度ポラタリティグラフに関する講演は情報処理学会の第56回プログラミング・シンポジウム予稿集に掲載された「オンラインゲームにおけるゲームバランスの調整手法の提案」で詳細が解説されています。