非同期テクスチャアップロードを使用すると、ディスクからテクスチャデータの非同期読み込みを行い、レンダースレッド上でタイムスライスで GPU にアップロードすることができます。これにより、主要スレッドで GPU アップロードの待ち時間を減少することができます。非同期テクスチャアップロードは、読み込み書き込みが許可されていないすべてのテクスチャに自動的に適用されるので、この機能のために、特に何かをする必要はありません。ただし、非同期アップロードの機能を調整することができるので、処理を少し理解することはこの制御を行う上で役立ちます。
プロジェクトを作成するとき、非同期アップロードが可能なテクスチャのテクスチャデータはストリーミングリソースファイルに保管され、非同期で読み込まれます。
テクスチャデータを読み込み、それを GPU にアップロードするために、1 つのリングバッファが何度も使用されます。それにより、必要なメモリアロケーションの容量が減少します。例えば、20 の小さいテクスチャがあるとき、Unity ではその 20 のテクスチャを処理する非同期読み込みリクエストが一気に設定されます。1 つの巨大なテクスチャがある場合は、リクエストはたった 1 回です。
バッファサイズが必要なテクスチャに対し十分でない場合、自動的にバッファサイズが変更されます。ただし、初めから、アップロードする最大サイズのテクスチャに合うように設定しておくのが最良です。そうしておくと、テクスチャが大きかった場合にバッファをサイズ変更する必要がないからです。
各フレームでテクスチャアップロードにかける時間は調整することができます。値を大きくするほど、テクスチャが GPU にアップロードされる時間は短く済みますが、これらのフレームで他のプロセスにより多くの CPU 時間を費やすオーバーヘッドも発生します。この CPU 時間は、GPU にアップロードするテクスチャがバッファに待機している場合にのみ消費されます。
バッファとタイムスライスのサイズは Quality Settings パネルで指定できます。
スクリプトを使用してバッファサイズとタイムスライスの値を調整することができます。
以下のスクリプトリファレンスを参照してください。 QualitySettings.asyncUploadTimeSlice
各フレームで非同期テクスチャアップロードに必要な CPU 時間のタイムスライスをミリ秒で設定します。ターゲットプラットフォームと API によって、設定したほうが良い場合もあります。アップロードするテクスチャがある場合は、関数呼び出しにのみ時間が消費されます。そうでない場合は、早期終了します。
以下のスクリプトリファレンスを参照してください。QualitySettings.asyncUploadBufferSize
非同期テクスチャアップロードのリングバッファサイズを設定します。サイズはメガバイト (MB) 単位。ターゲットプラットフォームによって、適当なサイズを設定します。ゲームにどんな大きなテクスチャを読み込んでも常にこのサイズが十分であるよう、気を付けてください。例えば、サイズが 22MB のキューブマップがあります。リングバッファのサイズを 16MB に設定すると、アプリケーションは、そのシーンを読み込む間に自動的にリングバッファを 22MB にサイズ変更します。
読み込み、書き込みができないテクスチャの場合、テクスチャデータは、resS (ストリーミングリソース) の一種で、アップロードはレンダースレッドで行われます。以前とまったく同じように AwakeFromLoad を呼び出す間、テクスチャは確実に使用できるようにされています。そのため、レンダリングの際の読み込む順番やテクスチャの可用性に関して変更はありません。
読み込みや書き込みが可能なテクスチャのように、その他のテクスチャの読み込みには、LoadImage(byte[] data) 関数での直接ロードや、Resources フォルダーからのロードなど、非同期バッファロードは使用されず、同期メソッドを使った古い方法が使用されます。