AssetBundleのインクリメンタルビルドの仕組み
- インクリメンタルビルド?
- インクリメンタルビルドの仕組み
- 挙動を確認する
- AssetBundleを消さずにManifestだけ消してみる
- Manifestを消さずにAssetBundleだけ消してみる
- 関連
Unity2019.2.10
インクリメンタルビルド?
AssetBundleのインクリメンタルビルドとは「変更のあったAssetBundleだけをビルドするための仕組み」です。
たとえば、いまAssetBundle AとAssetBundle Bをビルドしたとします。
次にAssetBundle Aを構成するアセットだけに変更を加えて再度ビルドします。
この時、AssetBundle Bには変更が加わっていないため、
前回ビルドしたものが残っていればそれを使うことでビルドする必要がなくなります。
このように変更が加わってものだけをビルドしてビルド時間を短縮する仕組みをインクリメンタルビルドといいます。
インクリメンタルビルドの仕組み
さてそれではUnityはどのようにこのインクリメンタルビルドを実現しているのでしょうか。
インクリメンタルビルドをするためには「更新されたかどうか」の判定をする必要があります。
UnityではこれをAssetFileHashとTypeTreeHashという二つのハッシュ値を使うことにより判定しています。
これらついて詳しくは以下の記事にまとめていますので必要に応じて参照してください。
これら二つのハッシュ値はAssetBundleをビルドする前に、そのAssetBundleを構成するアセットの情報から計算されます。
そしてそれらをビルド済みのAssetBundleのハッシュ値と比較します。
このハッシュ値は各AssetBundleがビルドした時に作られる、同名の.manifestファイルに書き込まれています。
このように、計算したハッシュ値と.manifestファイルのハッシュ値を比較して差分があればビルドを行い、なければビルドをスキップします。
以上がインクリメンタルビルドの仕組みです。
挙動を確認する
次にインクリメンタルビルドの挙動を確認してみます。
まず下記のようにAssetBundle_A
とAssetBundle_B
というPrefabを作ります。
それぞれのPrefabには以下のようにAssetBundle名を設定しています。
Asset名 | AssetBundle名 |
---|---|
AssetBundle_A | assetbundle_a |
AssetBundle_B | assetbundle_b |
この状態でビルドすると二つのアセットバンドルとそのManifestファイルが生成されます。
ここでAssetBundle_AのTransformに変更を加えて再びビルドしてみます。
assetbundle_aの更新日時が変わり、AssetBundleが更新されていることが確認できました。
なお、AssetBundleのビルドにはAssetBundleBrowserを使っています。
これについては以下の記事で説明していますので、必要に応じて参照してください。
AssetBundleを消さずにManifestだけ消してみる
インクリメンタルビルドの挙動を確認するために、もう少し検証をしてみます。
まず、以下のようにAssetBundleを作っておきます。
ここで、Manifestファイルだけを削除します。
そしてアセットには何も変更を加えず再ビルドを加えると下記のような結果となります。
アセットには何も変更を加えていないにもかかわらずAssetBundleが再ビルドされました。
このように更新判定のためのハッシュ値が書かれているManifestファイルが消えると更新判定ができないのでビルドが走ります。
Manifestを消さずにAssetBundleだけ消してみる
次に、反対にManifestファイルは消さずにAssetBundleだけを消してみます。
最初はこんな感じです。
この状態からManifestファイルだけを残してAssetBundleを削除します。
次にAssetには更新を加えずにビルドを行うと以下のような結果となります。
AssetBundleが消えたまま、再ビルドされませんでした。
AssetBundleの更新判定はあくまでManifestファイルのハッシュを見て行われるため、
今回はManifestを見てビルドをする必要がないと判断されたため、AssetBundleが消えたままになりました。