メモリUnityは、内蔵で動作によるシェーダサージ

  エディタが起動しているとき、シェーダ、多数の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)

不信的话使用解包软件打开看

 

 

おすすめ

転載: www.cnblogs.com/tiancaiwrk/p/11346375.html