見出し画像

【Unity】Async Upload Pipeline (AUP)とはなんなのか

Unity Blogにこんな記事が出てました。

Optimizing, performance, Async と、なかなかあつい単語が目白押しでなんだこれは!となりました。これはなんなのかざざっと呼んでみました。

結論としては、Unity2018.3からいままでUnityのなかで勝手にやってた

「GPUに送って使うデカいデータ(テクスチャとメッシュ)の転送方法を非同期にして調整もできるようにしたよ!」

ということみたいです。アプリケーションごとに最適化することでロード画面でカクつき軽減したり、ロード時間を早くしたりできるようになるそうです。

GPUに転送

そもそもテクスチャやメッシュは最終的にはGPUのVRAMに乗せて使用します。これらのファイルは.exeファイルとともにHDD上のリソースファイルとしてあったりするのですが直接GPUに送る手段はありません。したがって一旦メモリにロードしてCPU命令でGPUへ送る形になります。

Unityはこの処理をシーンのロード時など内部で行っており普段開発者は気にする必要がありません。が、カスタマイズできないので困ったりします。PrefabのInstantiate時にでかいテクスチャのロードでスパイクが出るのを避けるためにシーン開始時にまとめてロードしとくなんてのがあったりしました。

リングバッファ

AUPではこのメモリをリングバッファで管理し、空き部分にロード、GPUへ転送、バッファの使用部分解放、空き部分に別のデータをロード、と処理していきます。このバッファサイズはQualitySettingsメニューか以下のプロパティで変更できます。ここが調整できる点の1つめです。


QualitySettings.asyncUploadBufferSize 

アップロード

GPUへの転送処理はレンダースレッドで行われ1回の処理の最大時間を変更できます。中断できるんですね。すごい。これが調整できる点の2つめです。

QualitySettings.asyncUploadTimeSlice 

主にこの2つのパラメータを使ってアプリケーションごとに最適化しちゃいなよ!ということみたいです。

もしお役に立ちましたらスキ(♡マーク)をお願いします!!! noteアカウントがなくても大丈夫です。サポートもお待ちしています!