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