プロジェクトをビルドするたびに、Unity エディターはビルドに必要なすべてのシェーダーをコンパイルします。必要なグラフィックス API ごとに、必要なシェーダーバリアントをすべてコンパイルします。
Unity エディターでは、すべてを先行してコンパイルすることはありません。すべてのグラフィックス API に対応するすべてのバリアントをコンパイルするには、非常に長い時間がかかるからです。
その代わりに、Unity エディターは以下のようにしています。
Library/ShaderCache
フォルダーを確認します。シェーダーのコンパイルは、UnityShaderCompiler
というプロセスを使って行われます。複数の UnityShaderCompiler
プロセスを開始することができます (通常、マシンの CPU コアごとに 1 つ)。そのため、プレイヤーのビルド時にシェーダーのコンパイルを並行して行うことができます。エディターがシェーダーをコンパイルしていない間はコンパイラー処理は行われず、コンピューターのリソースを消費しません。
頻繁に変更されるシェーダーが沢山ある場合は、シェーダーキャッシュフォルダーが非常に大きくなる可能性もあります。このフォルダーの削除は安全で、Unity がシェーダーバリアントを再コンパイルするだけです。
プレイヤーのビルド時には、すべての “まだコンパイルされていない” シェーダーバリアントがコンパイルされるため、たまたまエディターがそれらを使用しなかった場合でもゲームデータに含まれます。
異なるプラットフォームは、シェーダープログラムのコンパイルに異なるシェーダーコンパイラーを使用します。以下はその例です。
pragma ディレクティブ を使用して、さまざまなシェーダーコンパイラーの設定を行うことができます。
シェーダのコンパイルにはいくつかのステップがあります。最初のステップの 1 つは前処理です。このステップでは、プリプロセッサー と呼ばれるプログラムが、コンパイラーのシェーダーソースコードを準備します。
In previous versions of Unity, the Editor used the preprocessor provided by the shader compiler for the current platform. Now, Unity uses its own preprocessor, also called the Caching Shader Preprocessor.
The Caching Shader Preprocessor is optimized for faster shader import and compilation. It works by caching intermediate preprocessing data, so the Editor only needs to parse include files when their contents change, which makes compiling multiple variants of the same shader more efficient.
キャッシングシェーダープリプロセッサーと従来の動作の違いについての詳細は、Unity フォーラムの New shader preprocessor を参照してください。
If you use AssetBundles, Unity might compile duplicate shaders if you reference one shader in two or more objects. For example:
This can increase the memory and storage space shaders use, and break draw call batching.
To avoid this, you can use the following approaches:
You can add materials and shader variant collections to an AssetBundle to specify which shader variants to include.
If you create a single AssetBundle, some shaders might stay in memory even if they’re no longer needed, because you cannot partially unload an AssetBundle. You can avoid this by creating a separate AssetBundle for each group of shaders you use together, for example a ‘forest’ AssetBundle and a ‘desert’ AssetBundle. See Managing loaded AssetBundles, or Memory management in the Addressables system if you use Addressables.
You can use the Asset Bundle Browser to check which assets in AssetBundles depend on other assets, and find out if any assets are duplicated.
ゲームのビルド中、Unity は内部シェーダーバリアントの一部がゲームで使用されていないことを検出し、ビルドデータから削除 (“ストリップ”) します。詳しくは、シェーダーバリアント を参照してください。