非同期テクスチャアップロードを使用すると、ディスクからテクスチャデータの非同期読み込みを行い、レンダースレッド上でタイムスライスで 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 フォルダーからのローディングなど、非同期バッファローディングは使用されず、同期メソッドを使った古い方法が使用されます。