Unity を検索

Addressable アセットシステムの新機能のご紹介

2021年4月14日 カテゴリ: Engine & platform | 7 分 で読めます
Books in library
Books in library

Addressable アセットシステムを使用すると、複雑な Unity プロジェクトのコンテンツを安全かつ効率的に管理できます。Synchronous Addressables API を使用すると、プロジェクトを Addressables を使った柔軟なシステムに以前よりも簡単に切り替えることができます。

Unity は、効率的なアセットとメモリの管理を必要とするプロジェクトでは、Addressable アセットシステム(「Addressables」とも呼ばれます)を利用することをおすすめしています。Addressables は、アセットの参照とパッケージ化の問題を分離し、再生モードとデプロイされたプレイヤーのビルドのどちらでも、より高速にイテレーションを回せるようにし、さらには自動メモリ管理とプロファイリングのためのツールを提供します。Addressables は、アセットをビルドしてアセットバンドルにします。アセットバンドルは、コンテンツの配布および実行時読み込みのためにアセットをパッケージ化する時に使われる、Unity 独自のファイル構造です。次に、Addressable アセットシステムは、コンテンツカタログを構築して、実行時の読み込みと依存関係の追跡をより柔軟に管理できるようにします。

Unity のアセットバンドルからの読み込みは、メモリから不要になったコンテンツを破棄する効率的な方法を提供します。Addressables を介して読み込むと、読み込まれたアセットとその依存関係の高水準の参照カウントが自動的に有効になり、使用されなくなったときにバンドルとバンドルに紐づけられたアセットを自動的に破棄できます。さらに、Addressables は、読み込まれたアセットおよびアセットバンドルの参照カウントをリアルタイムでデバッグするための視覚的なプロファイラーを提供します。 つまり、Addressable アセットシステムは、ゲームに使うアセットを保存・カタログ化して、素早い検索と読み込みをできるようにする上で役立つということです。アセットを準備して、運営中のゲームに配信する準備ができたら、Cloud Content Delivery についても調べてみてください。このソリューションは、コンテンツ配信ネットワーク(CDN)パートナーである Akamai を通じてこれらのゲームアセットを皆さんのゲームのプレイヤーにプッシュ配信します。コードとは完全に分離されています。Addressables と CDN を使用すると、ビルドサイズが大幅に削減され、更新を行うたびにプレイヤーにゲームの新しいバージョンをダウンロードしてインストールさせる必要がなくなります。

Addressable アセットシステムは、パッケージマネージャーから直接インストールできます。Unity 2019 LTS 以降でサポートされています。初めて使う際には、Addressable アセットシステムのドキュメントにあるガイドをご確認ください。また、Professional Services チームと共に顧客のプロジェクトを最適化した Patrick DeVarney が、Addressables を使ってメモリ節約に取り組んだ際の彼自身の経験に基づいて書かれたブログ記事もぜひお読みください。

既存の非同期的な挙動

ほぼすべての Addressables API は、本質的に非同期です。そのため、ユーザーにはハンドルを返して処理を進行し、命令が完了すると結果を取得します。このハンドルは AsyncOperationHandle です。

CDN サポートが必要なモバイル向け開発を行っている顧客に重点を置いていたため、Addressables は当初、この非同期のみのワークフローに基づいて設計されていました。これにより、コンテンツがどこに保存されていても、常に機能する安全な API を提供できるようになりました。ローカルにあるとみなしている(または最初はローカルにある可能性がある)ものを読み込むワークフローの例を考えてみましょう。ただし、実際にはリモートでホストされている依存関係が含まれています。そのアイテムを非同期で読み込むと、他に突然ダウンロードが必要になった時も処理できるようになります。

しかし非同期であるために生じる制限のために、プロジェクトによっては Addressables API を上手く使えないことがありました。多くの方は、リモートで管理しているコンテンツを持たないゲーム、またはダウンロード管理を非常に細かく制御するゲームを開発しています。私たちの顧客基盤が拡大・多様化する中、同期 API の必要性が認識されるようになりました。

Synchronous Addressables API

上記のような事情から、Synchronous Addressables API が追加されることになりました。これらの API は、Unity 2021.1、Unity 2020 LTS、および Unity 2019 LTS に対応する、Addressables パッケージのバージョン 1.17.4 以降で利用できます。

この追加により、プロジェクトで Addressables の使用を開始するために、アセット読み込みを非同期にする必要がなくなりました。この新しい同期版の機能は、AsyncOperationHandle の WaitForCompletion というメソッドとして提供されます。このメソッドは、命令の結果を返してきます。

前述のように、既存の Addressables API のほぼすべてが非同期であり、非同期版のメソッドはすべてハンドルを返します。ハンドルクラスに WaitForCompletion メソッドを含めることで、既存のすべての API にオンザフライで同期する機能を提供しました。

たとえば、以前は Addressables.LoadAssetAsync("MyPrefab")を呼び出すことができました。これは GameObject を扱う命令へのハンドルとなる、AsyncOperationHandle オブジェクトを返します。そのハンドルを使用して、WaitForCompletion を呼び出すと、読み込みが完了するまで、現在実行中のコードがブロックされます。完了すると、WaitForCompletion は要求されたゲームオブジェクトを返します。

非同期、同期のいずれにしても、すべての命令を解放する必要があります。命令自体を解放するか、結果を渡してそこから命令を検索することができます。

パフォーマンスへの影響

ほとんどの場合、同期読み込みは非同期読み込みと同等のパフォーマンスを発揮します。ただし、状況によっては、わずかに速くなったり遅くなったりする場合があります。また、いくつか特別な場合においては、大幅に遅くなります。

大幅に遅くなるケースの 1 つ目は、Addressables とのやり取りに多くのエンジン呼び出しが含まれる場合です。これは、一度に多くのアセットをロードする場合、または大きくて複雑な依存関係ツリーを持ついくつかのアセットをロードする場合に発生する可能性があります。Unity 2021.1 までは、非同期なエンジンインターフェイスを同期的に実行すると、呼び出しごとに遅延が発生するためにこの遅延が発生していました。私たちは、次の TECH ストリームリリースの Unity 2021.2 に向けて、この遅延の解決策をすでに盛り込んでいます。Unity 2021.2 は現在アルファ版が提供されています。

パフォーマンスに大きな影響を与える可能性のあるケースの 2 つ目は、他の多くの大きな命令がバックグラウンドで実行されているときに、小さな命令の中で WaitForCompletion を呼び出す場合です。1 回の命令で WaitForCompletion を実行すると、エンジンの非同期読み込み命令のキューがブロックされます。実行を待っている命令の前にいくつかのより大きな命令が入っている場合、待っている命令が完了になって戻ってくる前にそれらの大きな命令を終了させようとする可能性があります。

今後の展望

同期インターフェースが必要になることは以前からわかっていました。堅牢かつ信頼性の高い方法で既存のシステムに組み込むまでに予想していたよりも時間がかかりましたが、本日、この改善点を皆さんと共有できることをうれしく思います。

Addressable アセットシステムが、皆さんのプロジェクトのコンテンツ管理戦略にとって最適なものとなるために、1 つ適切な措置を講じることができていたなら幸いです。私たちは皆さんのフィードバックに耳を傾け、その内容を開発に活かすために出来ることを行っています。ですので、コメントや Addressables フォーラムで WaitForCompletion についての皆さんからのご意見をぜひお聞きしたいと思っています。

Unity のパイプラインと統合に関するロードマップの実行時アセット管理機能に関するタブをチェックして、私たちの作業の最新状況を把握していただけます。また、こちらのページから Addressables に関するアイデアを気軽にお送りください。

2021年4月14日 カテゴリ: Engine & platform | 7 分 で読めます