プロジェクトをビルドするたびに、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 は内部シェーダーバリアントの一部がゲームで使用されていないことを検出し、ビルドデータから削除 (“ストリップ”) します。詳しくは、シェーダーバリアント を参照してください。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.