【Unity】AssetBundleからモデルをロードする際の最適化ポイント
ゲームでキャラクターをロードしたりする際、画面がカクつくというのは割とよく見る光景です。今回はその辺りの対処法についてメモしておきます。
Async Upload Pipeline(非同期アップロードパイプライン)の活用
ロード時にカクつく要因の一つは、GPUへのアップロードです。これは一度に全てをアップロードするのではなく、分割でアップロード(タイムスライス)することで回避することが出来ます。使用出来るのは以下の設定項目です。
読み込み/書き込み有効
が無効
なテクスチャ(及びミップマップ)読み込み/書き込み有効
が無効
かつ、メッシュ圧縮
がオフ
なモデル
(※Unity 2018.3以降)
つまりアセットでの設定をしておけば、あとは裏で勝手によしなにしてくれます。 ただしインポート直後のモデル等は大抵ReadWriteがEnableなので、その辺り注意です。ユニティちゃんのモデルもReadWriteが付いてます。
また使用する上でのパフォーマンスについても、ある程度の調整が効きます。
非同期アップロードタイムスライス
の値
小さいとロードが伸びるがスムーズ、
大きいとロードが短縮されるが処理落ちを起こす非同期アップロードバッファサイズ
の値
一回のロードで扱えるサイズ。小さいと一度に処理できる量が減る
Unity 2018.3以前は、使用するデータの小ささもあったのか「分割数多め」の設定でしたが、Unity 2018.3から非同期アップロードバッファサイズ
を大きめに設定しています。この設定によって、ロードが倍くらい早くなるという話もあるそうです。
これらの設定は 編集 > 設定 > Quality
で確認することが出来る他、スクリプトからも設定することが出来ます。
Async Upload Pipelineについては下の記事が正しいです。
シェーダーのウォーミングアップ
モデルを表示する際に毎回ガッツリ止めてくれる要因の一つに、シェーダーのパースがあります。処理で言えば、Shader.Parse
やShader.CreateGPUProgram
といったものがそうです。 特にモバイルだとガツガツと止めてきます。
これを回避する為のアイディアは2つです。
- ドライバにシェーダーを事前にロードしておく
- ロードしたシェーダーを使い回す
シェーダーを事前にロードする
まずは事前にシェーダーをロードします。
ShaderVariantCollectionに事前ロードしておきたいシェーダー一覧を登録しておき、ShaderVariantCollection .WarmUpで実際にロードするだけです。
指定されたシェーダーは、カクついても問題ないタイミングで読んでおけば、以降カクつく事はありません。
全てのシェーダーを登録するとパースに恐ろしい時間がかかるので、必要なものだけを登録しておきます。
ロードしたシェーダーを使い回す
もう一つ、ロードしたシェーダーを使い回します。
ShaderVariantCollection
が事前ロードするシェーダーを、全てShaderVariantCollection
と同じAssetBundleに格納するだけです。
というのも、AssetBundleに暗黙的に格納された(AddressやAssetBundle Nameを指定されていない)アセット群は、基本的にAssetBundle毎に独立した存在とみなされるためです。
AssetBundle Browserで確認すると、同じアセットを参照しているものは警告が出ます。
同じアセットを別のAssetBundleが暗黙的に格納している場合、コンテンツの中身は完全に一致する”だけ”の、別のアセットとして扱われます。
そのため、今回のケースではShaderVariantCollection
でWarmUp()
しても、ロードされるのは同じAssetBundle内のシェーダーのみです。他のAssetBundleに格納されているシェーダーは別途ロードされることになります。
つまり、今回の理屈は以下のような事です。
- シェーダーをAssetBundleに明示的に指定することで、他のAssetBundleは明示的に格納したシェーダーを使うようにする。
ShaderVariantCollection
とソレが参照するシェーダーを同じAssetBundleに明示的に格納しておくことで、WarmUp()
出来るようにしておく
なおShaderVariantCollection
を格納しているAssetBundleを積極的にUnload
すると、AssetBundle間の参照関係やアセット運用周りがおじゃんになるので、そこんとこ注意です。
関連
その他、最適化ポイント云々
アセット設定の一括変更とかは、コレが楽で好きです。
色々試す前に「施工前と施工後」を確認できるようにする。話はそれからだ
Stay alert! Trust no one! Keep profiler!