「パーク」の大画面で他ユーザーとバトルを観戦する
「MagicOnion」によるリアルタイムサーバーを活用した「パーク」の機能にはさまざまありますが、ここでは一例としてバトル配信時のモニター観戦機能の解説をレポートします。
今作のバトル配信は、パークに集まった多数のユーザーとともにに大スクリーンに投影されたバトルを観戦するという臨場感あるものです。前作でもバトル配信機能はありましたが、その時は画面遷移で処理しており、ユーザーが集まるという形式ではありませんでした。

当初はストリーミングによる動画配信を検討していましたが、それでは動画データのダウンロードが発生し、通信待機などの不便が予想されます。そこでクライアント側でバトルを描画する形で実現できないか検討が行われました。
結果、サーバーに関してはパークのサーバー処理と同様、バトル側のサーバーとパーク側のサーバーの間に中継サーバーを設置することで実現。パークで描画する仕組みに関しては、これまでは3Dモデルを描画するひとつのレイヤーで対応していたものを、パーク用とバトル用で分けることに。ひとつの画面にパークシーンとバトルシーンが共存する環境であることから、パーク側のカメラは従来の方法で処理しつつ、バトル側のカメラはRenderTextureに一旦書き込んだ後、それをパーク側の配信モニターのマテリアルに設定しました。


これらの処理で描画は可能となりましたが、問題は配信時の負荷です。パークに100人ほどのプレイヤーが滞在することを考えると、スクリーンに投影するバトルそのものの負荷を軽減する必要が出てきたわけです。そこで画面やカードイラストの解像度を落としたり、本来は3Dモデルだったものを2Dにしたり、バトルエフェクトを削減するなどしてスクリーンに投影される映像の最適化を図りました。

さらに手札用のカメラや画面演出用のカメラなど複数のカメラを使用していたシステム面では、一部カメラを統合することで負荷を軽減。それに伴い描画順の不具合が随所で発生しましたが、オフセット調整で地道に改善し最適化しました。
またこれらの最適化をなすには、作業の現在地を知るための負荷計測が不可欠です。『Shadowverse Worlds Beyond』では実際のプレイ状況に近づけるため、100人分のユーザーが動き回る状況を自動化することで実現。フレームレートの計測では、バッテリー温度上昇の影響も計測するため、時間経過によるフレームレートの変化もデータとして取得しました。
そのほか「バトル配信のどの演出を削れば、どれほどの効果があるのか」といったことを確認するため、MemoryProfilerの結果をCSV出力できるような仕組みを作り、メモリ消費の計測の結果を比較しやすくしました。
以上の取り組みにより、パークの品質を落とさずにバトル配信機能を実装することができました。


カードゲーム部分の開発について
続いて『Shadowverse Worlds Beyond』の核となるカードゲーム部分についての解説です。
『Shadowverse Worlds Beyond』のバトルは1対1で行うターン制となっており、対人戦はもちろんAIとも戦うことができます。そのような性質であるため、クライアント改竄による不正、通信パラメータの解析による情報の不正取得など、あらゆる不正行為を防ぐ必要があります。

前作では不正防止のため、カード能力、ソロプレイ時の敵AI情報、制限時間、切断による勝敗判定などをクライアント側・サーバー側の両方で保持し、サーバー側ではおもに検証などを行っていました。しかしそれらバトルロジックがクライアント側にあることで課題もありました。結果的にクライアントとサーバー間の情報のやり取りが猥雑になってしまったのです。またAIの思考速度を端末に依存していたことから負荷が増大し、発熱につながるケースもありました。
そこで持ち上がったのがバトルロジックをクライアント側からサーバー側へ完全移行するという案でした。
実は前作運用当時から検討がされていましたが、通常の運用と並行して作業するには規模が大きくなかなか手を付けることができません。その折に『Shadowverse Worlds Beyond』の企画が始動し、バトル部分の再設計が必要ということでついに実施されることになったのです。
その結果、クライアント側とサーバー側で行ったり来たりさせていた情報伝達は、サーバー側の処理が増えたことでシンプルなやり取りに改善されました。また新たにAIのアドバイス機能も実装することができました。

反面、新たな課題も浮上します。カード操作をした際の処理もサーバー側で行うことになったため通信が発生し、演出に若干のラグが生じたり、操作した際に引っかかりが感じられたりするようになってしまいました。そこで演出が止まったように見えないよう、アニメーション演出の合間に通信処理を完了させるよう調整。そのほか通信などの処理が妨げになっていないか確認し改善に努めました。

このほかサーバー移行のメリットとして、カードゲームのテストプレイの効率化、カード能力の自動デバッグの高速化、カードマスターの整理が可能になるなどの恩恵もありました。
まずカードゲームのテストプレイの効率化について。サーバーの移行に伴い、開発環境ではブラウザでもカード操作ができるようになりました。これにより開発初期段階からゲームのルールや初期カードの調整が可能となりテストプレイの効率がアップしました。
次にカード能力の自動デバッグの高速化について。カード能力ロジックがサーバー側で完結しているので、前作ではバトルで数分かかっていたものが、今作ではサーバー側で演出をスキップできることもあり10ミリ秒程度に大幅短縮。この高速化により、開発中のカード能力の調整コストを低減し、2カ月間隔の新カードパックのリリースに貢献しました。
最後にカード能力のマスターの整理について。前作では運用が長くなるにつれ、カードの数や新しい能力効果の追加により、カード能力のマスターが肥大化していきました。カード能力ロジックと演出ロジックがクライアント側で密接に関わっており、能力と演出に関わる記述が混在していたのが原因です。しかし今作ではサーバー移行により、カード能力処理と演出処理が分離できるようになり整理することができました。
以上が『Shadowverse Worlds Beyond』を例にしたCygamesのスマホゲームにおけるクライアント部分の技術設計となります。
これからも最高の体験をユーザーに提供するべく技術もゲームも超進化すると会場に向けて宣言した開発チーム一同。今後の運用や新作タイトルに注目です。






