【CEDEC2017】『オルタナティブガールズ』エンジニアが挑んだAssetBundleの管理方法―基盤化に伴う問題と対処法を紹介
8月30日から9月1日にかけて、パシフィコ横浜で開催されたCEDEC 2017。本稿では8月30日に実施された講演「複雑化するAssetBundleの配信からロードまでを基盤化した話」の模様をお伝えする。
この講演には『オルタナティブガールズ』の開発に携わるQualiArtsのリードエンジニア・福永亘氏と、技術基盤グループリードエンジニアの石黒祐輔氏が登壇。AssetBundleを基盤化した「OCTO」開発までの道のりを語った。
▲福永亘氏
▲石黒祐輔氏
そもそもAssetBundleとは、Unity独自の機能で複数のAssetをひとつにまとめたものを指す。これを導入することでコンテンツの更新が自由に可能となるほか、アプリの容量制限の解決にもつながる。その一方でAssetBundleは世代管理が困難であったり、膨大なAssetの管理など問題も多い。また同一のAssetBundleじゃ複数同時にロードできないといった、クライアント側の問題も抱えてしまう。そこで福永氏、石黒氏を中心としたQualiArtsのスタッフは自社で基盤を開発し、よリ効率的な運営を目指す、つまり「OCTO」を開発することにしたのだ。
まず福永氏はどんな「どんな基盤がほしいのか」を考えた結果、サーバの観点では運用が楽、配信が早い、そして正確といったポイントを挙げた。さらにSDKの観点では動作が高速、どんなゲームでも使える汎用性、使いやすさなどを重要視した。
サーバ側の課題としては、まず膨らみ続けるデータ量がある。3Dのゲーム1プロジェクトあたり、AssetBundleが十数GB~数百GBになる可能性もあるというのだ。そこで同社はGoogleCloudStorageを採用。これにより、複数ゲームの大量のAssetBundleを管理するスケーラビリティを手に入れた。
またゲームを運営する中で起こる突発的なトラフィックに対しては、Google Cloud Platformとdockerなどを採用した解決を図った。コンテナ型仮想化システムであるdockerを採用した理由としては、構成管理が不要で運営が楽になる点、開発から本番まで環境が変わらないシンプルさが魅力的に見えたからだという。
AssetBundleの世代管理に求められることは、リリースごとの差分が取れること、加えて各端ごとにことなる差分も管理できること。AssetBundleの更新も管理できれば利便性はさらに広がる。福永氏は世代管理のために、サーバ側DBとクライアント側DBを管理するために「全体のリビジョン」「ファイルのリビジョン」「端末のリビジョン」という3つのリビジョンを使用し、ファイル単位での更新など細かい管理にも対応できるようにした。
続いては石黒氏が、クライアント側の課題と解決方法を解説した。AssetBundleにおけるクライアントはUnity APIだけで必要最低限のことはできるが、「自由度が低く、求める水準のコントロールができない」と石黒氏は語る。また古いキャッシュの削除が難しかったり、同じAssetBundleをロードできない制限があったりと、さまざまな面で問題が発生する。
そこでAssetBundleを管理するSDKに求める機能として、メタデータの世代管理、キャッシュの独自管理ができる端末の「ローカル管理機能」。そして適切なタイミングでロード・アンロードができる「ロード管理機能」、ARIサーバとの通信、AssetBundleのダウンロードを行う「通信機能」の3点を重要視した。
まずはアプリで使うすべてのAssetBundleなどのメタデータを世代管理するローカルDBを用意することに。ここでは依存の最小化、実行時パフォーマンス維持のためSQLiteは使用せず、データ抜き出しなどの攻撃を避けるためAESで暗号化を施した。また「ローカルDB用の検索インデックスは気をつけないと、メモリを消費してしまう」という問題もあったという。そこでUnity標準のキャッシュ管理に頼らず、独自キャッシュによる管理を行うことにした。独自管理は初期化と同時にキャッシュ走査を別スレッドで始める特徴を持ち、ほかにも自動削除しないオプション、名前による個別削除などにも対応した。
続いてロード管理だが、Unityには同じAssetBundleを別にロードしてはいけない制約があり、これも開発者を悩ませている。そこで「OCTO」では参照数をカウントし、参照が0になったらアンロードするように改良。またGameObjectの静止に連動させて、参照数を増減させる補助用のコンポーネントも取り付けた。
「OCTO」にはアセットバンドル以外のどんなファイルも扱えるResources機能も搭載されている。これによってGame側がファイル送信サーバを用意しなくても配信が可能になった。音声再生などがUnity外でもそのまま使えるといったメリットも生まれた。
最後に石黒氏が「特に力を入れて開発した」という通信機能について。通信はスマートフォンゲームの必需品だが、ユーザー体験に与える影響は大きく、技術力の差が如実に現れる場所でもある。
基本的にはUnityWebRequestで問題ないというが、石黒氏は実際に使ってみて、「C#へのメモリコピーのコストは避けられない」「受信イベントがメインスレッドで呼ばれす」と問題点も挙げていく。これらの問題を解決するべく、独自にネイティブ実装し、C#から呼び出す手法に切り替えたというのだ。これで効率的にファイルをダウンロードすることが可能になり、メモリ使用量、CPU使用率、ダウンロード速度も改善されたという。
こうして完成を迎えた「OCTO」は、現在『オルタナティブガールズ』など3タイトル、4か国で運用が行われ、今のところ大きなトラブルも発生していないという。今後はダウンロードするためのURLを毎回取得しなければいけない点を改善、さらにUnityそのものの進化に追従していきたいと展望を述べ、講演を締めくくった。
この講演には『オルタナティブガールズ』の開発に携わるQualiArtsのリードエンジニア・福永亘氏と、技術基盤グループリードエンジニアの石黒祐輔氏が登壇。AssetBundleを基盤化した「OCTO」開発までの道のりを語った。
▲福永亘氏
▲石黒祐輔氏
■基盤開発によリ効率的な運営を目指す
そもそもAssetBundleとは、Unity独自の機能で複数のAssetをひとつにまとめたものを指す。これを導入することでコンテンツの更新が自由に可能となるほか、アプリの容量制限の解決にもつながる。その一方でAssetBundleは世代管理が困難であったり、膨大なAssetの管理など問題も多い。また同一のAssetBundleじゃ複数同時にロードできないといった、クライアント側の問題も抱えてしまう。そこで福永氏、石黒氏を中心としたQualiArtsのスタッフは自社で基盤を開発し、よリ効率的な運営を目指す、つまり「OCTO」を開発することにしたのだ。
まず福永氏はどんな「どんな基盤がほしいのか」を考えた結果、サーバの観点では運用が楽、配信が早い、そして正確といったポイントを挙げた。さらにSDKの観点では動作が高速、どんなゲームでも使える汎用性、使いやすさなどを重要視した。
サーバ側の課題としては、まず膨らみ続けるデータ量がある。3Dのゲーム1プロジェクトあたり、AssetBundleが十数GB~数百GBになる可能性もあるというのだ。そこで同社はGoogleCloudStorageを採用。これにより、複数ゲームの大量のAssetBundleを管理するスケーラビリティを手に入れた。
またゲームを運営する中で起こる突発的なトラフィックに対しては、Google Cloud Platformとdockerなどを採用した解決を図った。コンテナ型仮想化システムであるdockerを採用した理由としては、構成管理が不要で運営が楽になる点、開発から本番まで環境が変わらないシンプルさが魅力的に見えたからだという。
AssetBundleの世代管理に求められることは、リリースごとの差分が取れること、加えて各端ごとにことなる差分も管理できること。AssetBundleの更新も管理できれば利便性はさらに広がる。福永氏は世代管理のために、サーバ側DBとクライアント側DBを管理するために「全体のリビジョン」「ファイルのリビジョン」「端末のリビジョン」という3つのリビジョンを使用し、ファイル単位での更新など細かい管理にも対応できるようにした。
■SDKで重要なのは「ローカル管理」「ロード管理」「通信機能」
続いては石黒氏が、クライアント側の課題と解決方法を解説した。AssetBundleにおけるクライアントはUnity APIだけで必要最低限のことはできるが、「自由度が低く、求める水準のコントロールができない」と石黒氏は語る。また古いキャッシュの削除が難しかったり、同じAssetBundleをロードできない制限があったりと、さまざまな面で問題が発生する。
そこでAssetBundleを管理するSDKに求める機能として、メタデータの世代管理、キャッシュの独自管理ができる端末の「ローカル管理機能」。そして適切なタイミングでロード・アンロードができる「ロード管理機能」、ARIサーバとの通信、AssetBundleのダウンロードを行う「通信機能」の3点を重要視した。
まずはアプリで使うすべてのAssetBundleなどのメタデータを世代管理するローカルDBを用意することに。ここでは依存の最小化、実行時パフォーマンス維持のためSQLiteは使用せず、データ抜き出しなどの攻撃を避けるためAESで暗号化を施した。また「ローカルDB用の検索インデックスは気をつけないと、メモリを消費してしまう」という問題もあったという。そこでUnity標準のキャッシュ管理に頼らず、独自キャッシュによる管理を行うことにした。独自管理は初期化と同時にキャッシュ走査を別スレッドで始める特徴を持ち、ほかにも自動削除しないオプション、名前による個別削除などにも対応した。
続いてロード管理だが、Unityには同じAssetBundleを別にロードしてはいけない制約があり、これも開発者を悩ませている。そこで「OCTO」では参照数をカウントし、参照が0になったらアンロードするように改良。またGameObjectの静止に連動させて、参照数を増減させる補助用のコンポーネントも取り付けた。
「OCTO」にはアセットバンドル以外のどんなファイルも扱えるResources機能も搭載されている。これによってGame側がファイル送信サーバを用意しなくても配信が可能になった。音声再生などがUnity外でもそのまま使えるといったメリットも生まれた。
最後に石黒氏が「特に力を入れて開発した」という通信機能について。通信はスマートフォンゲームの必需品だが、ユーザー体験に与える影響は大きく、技術力の差が如実に現れる場所でもある。
基本的にはUnityWebRequestで問題ないというが、石黒氏は実際に使ってみて、「C#へのメモリコピーのコストは避けられない」「受信イベントがメインスレッドで呼ばれす」と問題点も挙げていく。これらの問題を解決するべく、独自にネイティブ実装し、C#から呼び出す手法に切り替えたというのだ。これで効率的にファイルをダウンロードすることが可能になり、メモリ使用量、CPU使用率、ダウンロード速度も改善されたという。
こうして完成を迎えた「OCTO」は、現在『オルタナティブガールズ』など3タイトル、4か国で運用が行われ、今のところ大きなトラブルも発生していないという。今後はダウンロードするためのURLを毎回取得しなければいけない点を改善、さらにUnityそのものの進化に追従していきたいと展望を述べ、講演を締めくくった。
(撮影・記事執筆 ユマ)
会社情報
- 会社名
- 株式会社サイバーエージェント
- 設立
- 1998年3月
- 代表者
- 代表取締役 藤田 晋
- 決算期
- 9月
- 直近業績
- 売上高7202億0700万円、営業利益245億5700万円、経常利益249億1500万円、最終利益53億3200万円(2023年9月期)
- 上場区分
- 東証プライム
- 証券コード
- 4751
会社情報
- 会社名
- 株式会社QualiArts
- 設立
- 2016年10月
- 代表者
- 代表取締役社長 辻岡 義立