【Unity】シェーダーコンパイルによるスパイクを減らす

DEVELOP, Unity

外部からリソースを取得して、圧縮解凍まで行ってくれるUnityの便利な機能であるAssetBundle(アセットバンドル)。便利なんですが特徴を掴んでおかないとロード時間や、メモリ消費に影響が出てしまいます。

そもそも、AssetBundleはデータ作成時にそれ単体で動作する様に参照しているものは全て取り込まれる。

という仕様になっています。従って、同じファイルを参照した別々のAssetBundleデータをロードすると、たとえ同じファイルをを参照していても個々で扱われ、メモリには重複してロードされることになります。

目次

駄目な例

SpriteWithMaskはシェーダーファイルです。同じシェーダーを参照した別々のアセットバンドルをロードした数だけメモリに積まれてしまいます。これは大変だ。

そして、その分スパイクが発生する。 スパイクっていうのは簡単にいえばカクつきの事。

解決方法

この解決方法としては、先にShaderファイルそのものをAssetBundleにしてロードしメモリに載せておく。するとAssetBundleに依存関係ができるためそれを参照する様になり自然とスパイクが減ります。

勿論、依存関係の構築をしておけばこれを楽に解決出来たりもしますが、運用中のアプリに適用するとなるとシェーダーファイルだけ先読みして、常駐しておくのもアリだと思います。

Posted by kazupon