CullingGroup API
プロシージャルマテリアル

非同期テクスチャアップロード

非同期テクスチャアップロードは、ディスクからのテクスチャデータの非同期ロードを可能にし、レンダースレッドの GPU にタイムスライスしたアップロードを可能にします。これにより、メインスレッドでの GPU アップロードの待ち時間が短縮されます。非同期テクスチャアップロードは、読み込み書き込みが不可能なすべてのテクスチャに自動的に使用されるため、この機能を使用するために直接何かを行う必要ありません。ただし、非同期アップロードの操作のある面は制御可能です。ですから、この処理を理解することは、非同期アップロードの制御を行うために役立ちます。

プロジェクトを作成するとき、非同期アップロードが可能なテクスチャデータはストリーミングリソースファイルに保管され、非同期で読み込まれます。

メモリやタイムスライスに対する簡単なフル制御

テクスチャデータを読み込み、それを GPU にアップロードするために、1つのリングバッファが何度も使用されます。それにより、必要なメモリアロケーションの容量が減少します。例えば、20の小さいテクスチャがあるとき、Unity ではその 20のテクスチャを処理する同期読み込みリクエストが一気に設定されます。1つの巨大なテクスチャがある場合は、リクエストはたった 1回です。

バッファサイズが必要なテクスチャに対し十分でない場合、自動的にサイズ変更されます。ただし、初めから、アップロードする最大サイズのテクスチャに合うように設定しておくのが最良です。そうしておくと、テクスチャが大きかった場合にバッファをサイズ変更する必要がないからです。

各フレームでテクスチャアップロードにかける時間は調整することができます。値を大きくするほど、テクスチャが GPU にアップロードされる時間は短く済みますが、これらのフレームで他のプロセスにより多くの CPU 時間を費やすオーバーヘッドも発生します。この CPU 時間は、GPU にアップロードするテクスチャがバッファに待機している場合にのみ消費されます。

バッファとタイムスライスのサイズは Quality Settings パネルで指定できます。

Quality Settings パネルの非同期アップロード設定
Quality Settings パネルの非同期アップロード設定

API スクリプトを使用した非同期テクスチャアップロード

スクリプトを使用してバッファサイズとタイムスライスの値を調整することができます。

タイムスライス

以下のスクリプトリファレンスを参照してください。 QualitySettings.asyncUploadTimeSlice

各フレームで非同期テクスチャ アップロードに必要な CPU 時間のタイムスライスをミリ秒で設定します。ターゲットプラットフォームと API に基づいて設定します。アップロードするテクスチャがある場合は、時間は、関数コールのみで消費されます。そうでない場合は、すでに存在します。

バッファサイズ

以下のスクリプトリファレンスを参照してください。QualitySettings.asyncUploadBufferSize

非同期テクスチャアップロードのリングバッファサイズを設定します。サイズはメガバイト (MB) 単位。ターゲットプラットフォームに応じて、適当なサイズを設定します。ゲームにどんな大きなテクスチャを読み込んでも常にこのサイズが十分であるよう、気を付けてください。例えば、サイズが 22MB のキューブマップがあります。リングバッファのサイズを 16MB に設定すると、アプリケーションは、そのシーンを読み込む間に自動的にリングバッファを 22MB にサイズ変更します。

ノート

読み込み、書き込みができないテクスチャの場合、テクスチャデータは、resS (ストリーミングリソース) の一種で、アップロードはレンダースレッドで行われます。以前とまったく同じように AwakeFromLoad を呼び出す間、テクスチャは確実に使用できるようにされています。そのため、レンダリングの際の読み込む順番やテクスチャの可用性に関して変更はありません。

読み込みや書き込みが可能なテクスチャのように、その他のテクスチャの読み込みには、LoadImage(byte[] data) 関数での直接ローディングや、Resources フォルダーからのローディングなど、非同期バッファローディングは使用されず、同期メソッドを使った古い方法が使用されます。

CullingGroup API
プロシージャルマテリアル