エディタが起動しているとき、シェーダ、多数のPCプロジェクトを使用し、内蔵の標準シェーダを使用し、すべてのものは、専用メモリ1Gの実行についての、しかしAssetBundleパッケージを実行した後、EXEランニングメモリー良いです20Gは、シーンを入力するように急増していませんが、単純に考えられません。
ビルトインシェーダがGraphicSettingsに最初に追加された自然の初めににそれをすべてのあまりを導くSVNアート人々はシェーダコンパイラは、シェーダ変異体の問題ではありません考慮して、SpeedTree、花や木々のすべての種類を追加見てAlwaysIncludedShadersの内側に行きます
開くことができるようなシナリオを加えた後、実行メモリはまだプロファイラービューへの接続を構築developerment ...... 12Gにレースをされ、その後、ちょうどShaderLabは... 5.7gの計上だから、それが本当にシェーダによって引き起こされました各シェーダ資産発見のリソースをご確認ください
各オブジェクトに同じことを再使用しないシェーダは、コンパイルを繰り返した!!!
(シェーダの表示サイズは、サイズのみを参照し、コンパイラの実際のサイズは内部行くShaderLabとみなされることに注意してください)
私は、コンパイラの混乱が発生し、各オブジェクトのバリアントランタイムは、各オブジェクトで、その結果、唯一の変異体であると考えられているので、これはできません推測コンパイル?だから、エディタでシーンを実行し、すべての亜種を入れてきました自動的に記録され、自動的に時間を実行してみてくださいロードします。
(動作状態でシーン作成プリロードシェーダバリアントコレクションを実行した後)
しかし、で、またはメモリなど何もありません。
公式結果は、カード上のビルドエグゼが死んでいるときと同じ、応答しなかった数十分は、このリストに追加することができないと述べて標準シェーダがAlwaysIncludedShadersに追加しようとするが、中に入ります。
言われたそれを見つけるために団結公式フォーラム、誰も返事、古いポストを見つけ、:
https://forum.unity.com/threads/standard-shader-duplicated-in-asset-bundle-build.593248/
Unity团队的这个人叫我们自己把Built-In Shader下载了放到工程里面去, 替换掉原来使用的Standard Shader, 可是为什么? 也不说明原因, 然后后面也没有什么有用的回复了,
这不是多此一举吗? 所以根据他的说法, 我猜测在使用AssetBundle时, Built-In Shader的封包方式应该跟未命名assetBundleName 的资源一样, 哪个包需要它, 它就被封到哪个包里去,
然后在实例化的时候, 直接从那个包里对shader读取然后编译, 因为很多材质是被交叉使用的, 很多材质都单独成包, 所以会造成明明是相同的shader并且变体都一样仍然被多次编译的BUG.
既然这样猜测了, 那就实测一下吧, 新建一个工程, 拖进去一些建筑之类的, 首先测试Built-In 的Standard Shader.
(场景)(材质, 每个都单独成包)
因为材质都单独成包了, 所以运行时应该Standard Shader应该会每个材质对应一次编译
(每个单独包还挺大)
这里看到了ShaderLab相当大, 并且还真是每个编译的Standard Shader 对应一个材质... 查看文件的话, 每个材质把Shader封进去了之后, 达到98KB大小, 非常大.
总之就是最坑人的情况 : 文件又大, 运行又占内存, 运行时编译又花时间!!!
接下来我把所有材质封到一个包里, 这样理论上来说所有用到Standard Shader 的材质都封一个包, 也就是运行时根据变体数量来编译, 不会进行重复编译了吧.
(全都在standard这个包里了)
(打包后运行跟预想一样, 感觉没有重复编译了)
(明显这些同一个包里的材质共用了一个编译后的Shader)
(所有材质打成的包, 只有206KB)
不信的话使用解包软件打开看