時代に翻弄されるエンジニアのブログ

ゲームプログラマをやっています。仕事やゲームや趣味に関してつらつら書きたいと思います。

キャッシュという悪魔

キャッシュという悪魔に出会いました。
今日はそんなお話です。

短く結論

  • AssetBundeBuild で同じファイルをビルドしても違うハッシュの.manifest が生成された
  • プラットフォーム切り替えによって、キャッシュが消えたところで、もう一度行ったら治った
  • ショ キ カ タ イ セ ツ

何が起きたのか

Unityを使った開発では、基本的にアセットファイルをAssetBundle という形式に圧縮し、サーバー上に配置します。配置されたデータはゲーム開始時にダウンロードされて、内部で解凍され、ゲームに利用されます。

ゲームのデータ更新時はこのようにアセットのダウンロードのフェイズが存在します。そのときに普通はすべてをダウンロードするのではなく、差分ファイルのダウンロードを行います。つまり差分を検出する必要があるのです。

差分があるかどうかを判断する方法はいろいろありますが、だいたいAssetBundle のハッシュ値を用います。(詳しくは以下のリンクを参照)僕の作成するゲームでもファイルの差分として、AssetBundleBuild の結果として出力される .manifest ファイル内の AssetFileHash をよく使用します。

tsubakit1.hateblo.jp

ですが、先日ある事件が起こりました。それは、いくら同じファイルをビルドしても、違う、AssetFileHashが生成されるというものです。発生当初はいろいろなものを疑いました。何か差分があるんじゃないか?そもそも、差分比較の仕組がおかしいのではないか?アセットの.meta ファイルが間違っているのではないか?

いろいろな可能性を探ってみましたが、一向に事態は収まりませんでした。僕のシステムでは、ビルド時間の短縮と、プラットフォーム切り替え時間の短縮のために、Android用のビルドマシンとiOS用のビルドマシンの2つを使用しています。今回の問題はiOSの方でしか起きていませんでした。

そこで、やけくそになり、逆のマシンでビルドを行いました、当然プラットフォームの切り替えの時間がかかったり、インポートのし直しなどでかなりの時間を使ってしまいましたが、無事ビルドが終わり、結果、差分が出なくなりました。

その後、iOS用のビルドマシンが悪いのかなと思いながらも、また、正常のビルドマシンでビルドしたところ、なんと差分が出なくなりました。

プラットフォーム切り替えによってなにかが変わったのか、、、そうキャッシュです。短絡的ですが、キャッシュが削除された、もしくは設定がリセットされた。どちらにしても、そのキャッシュがAssetBundle に何らかの影響を与えていたとしか思えません。AssetBundleBuild の中を見ることができればいいのですが、見ることができないのでそれが結論です。

短絡的ですが、わけのわからない事態に陥ったら初期化が一番なのかもしれませんね。。。
こんなお話に付き合っていただきありがとうございました。