見出し画像

アセットの事前ダウンロードをだいたいなくした話

目次
1. はじめに
2. アセットのダウンロードについて
3. 方針・アーキテクチャの見直し
4. 具体的な実装エピソード
5. 成果と今後について

1. はじめに

みなさまお久しぶりです。ようてんと申します。ちょっと前から、だいぶ影が薄くなった(はずである)、ダウンロード画面の話です。

もう昨年秋の話になりますが、「終わりなき挑戦プロジェクト」というものに取り組みまして、その中で「ダウンロードを快適にする」というテーマがありました。その後、長らくドッグフーディングをしたり、設定メニューを整備したりして、1月末に現在の「必要なファイルを都度ダウンロードする方式」に切り替えました。

まだまだ改善の余地がいっぱいあるのですが、この切り替えでどんなことをしたのかを紹介させていただきます。

2. アセットのダウンロードについて

画像1

REALITYアプリは、ネイティブ部(iOSではSwift、AndroidではKotlinで書かれた範囲、の意)とUnity部のハイブリッド構成になっておりますが、Unityのアセットバンドルとしてアバター・ギフト・ゲーム用のデータなどをアプリ本体とは別にダウンロードして動作します。

画像2

この対応の実施前は、あらかじめ必要なファイルを全て一括ダウンロードした上で動作していたため、「新規インストールのアバターカスタマイズ時」「アバターホームの表示時」「(低遅延モード)配信の視聴を開始時」に最大で5,000個以上・数百MBのファイルのダウンロードが必要でした。

画像3

画像4

このことで、アプリの新規登録時になかなかダウンロードが終わらず離脱されてしまったり、すぐに視聴したい推しの配信がはじまったのにダウンロードが終わらないという悲劇につながったりしていました。

そんな仕組みを、ざっくりと「必要になった際にその都度取ってくる」方式に切り替えました。

3. 方針・アーキテクチャの見直し

こういう、大きな方針転換をする際には、「このアーキテクチャは妥当なのか?」という筋の良さみたいなものについて、腹づもりを決めておくのが肝要です。

旧アーキテクチャがどう決定されたのか、ちょっと昔話をします。

画像6

REALITYアプリは、もともと視聴専用のネイティブ(Swift/Kotiln)アプリであったREALITYに、アバター・配信機能をもったUnityアプリであるREALITY Avatarが合流したという歴史があります。(上記の画像は「REALITYとVRMとcluster連携」というエントリ中で紹介されている資料より抜粋したものです。よかったら読んでみてください。)

その前身であるREALITY Avatarの開発時には、フルUnityだったこともあり「ゲームのアーキテクチャを踏襲し、全てのデータがローカルにある前提で組むほうが素直で楽なはず」と考えました。大きなアップデートがあった際には、まず数GBのダウンロードを最初にさせるような想定です。

ただし、これはどちらかというと当時の体制上「アセットバンドルをよしなに扱う技術力もノウハウも足りない」かつ「3Dのアバターアセットをつくるのがめちゃくちゃ大変なのでファイルサイズが何GBとかの世界になるのがまだ現実的ではない未来の話」のような状況での決定でした。

・「ゲーム」は必要なシーンの起動前に全てが揃っているべきで、ロードやGCがシビアに影響するようなアクションゲームなどでは、事前にメモリ上にデータがロードされているのが望ましい。
・「Webコンテンツ」は基本的には全てのデータを動的にダウンロードし、近年は多くの構成要素を非同期にロードする仕組みになっている。

ここで、本テーマに立ち向かう際にあらためて「REALITYアプリはどうすべきか?」について、徐々にアバターをベースにしたコミュニケーションができるSNSアプリとしての要素が増えつつある中で、「Webコンテンツに近いアーキテクチャの方が自然」であり、おそらくこちらが期待されてしまうであろう、と考えました。

4. 具体的な実装エピソード

いくつか、散発的ですが具体的な実装エピソードを紹介しておきます。

画像7

・数百MBのデータのダウンロードが必須でしたが、新規にインストールしても、2MB程度に減りました。
・起動時のチェックがダウンロード済みのファイル数に依存するため、ネットワーク環境が安定していれば、「一括ダウンロード」はむしろしない方が快適だったりします。
・強制的に事前にダウンロードさせるアセットは「マスタ系データ」と「シェーダ」に限定しました。
・どちらも適切な非同期のロード待機とリトライの実装で回避できるはずなのですが、このあたりを扱う初期化シーケンスは歴史的経緯もあってかなり複雑なこと、ここまで限定できればファイルサイズとしては十分に小かったため、いったん気にしないことにしています。
・元々ギフトは動的にダウンロードする能力があったのですが、アバターまわりのロードも同様に、「ローカルになければダウンロードする」つくりに変更しました。エラーハンドリングを強化するもぐらたたきを続けています。
・(4人コラボで遊べる)Unityのゲームについては、ゲーム単位で必要なアセットを1バンドルにまとめてAll or Nothingで一部ファイルのみ存在しないようなことがないようにしています。
・クローゼットのアイコンがなかなかロードされず、真っ白な表示が長く続くことは、元々のつくりもあるのですがとてもバグっぽいので、あとでどうにかしたいと思っています。

5. 成果と今後について

さて、この対応を行った成果ですが、もともと配信・視聴がコアであり、インターネットが元気である必要性が高いアプリの性質もあって、期待以上に多くのケースで快適になりました。

アバターのパーツのロードは別のタイミングでまた少し手を入れたのですが、顔色が悪くなる(デカールの描画に問題があります)確率が逆にあがっていたり、コラボの入れ替え時にアバターがまるごと降ってこないみたいなのは変わらず観測されており、そっちは別にチャレンジが必要そうです。

また、最近は「ダウンロードが全く進まない」というレビューを主にグローバル方面からいただいており、どうやって尻尾を捕まえたものか、と悩んでいます。

今回「必要なファイルを都度ダウンロードする方式」に舵を切ったわけで、ファーストアタックとしては成功したのかな、と考えておりますが、別の新しい問題もいっぱい出てきているので、順次改善を続けていきたいと思います。

画像5