AssetBundle の圧縮(3) 圧縮上段
圧縮の方針
仮定
- アーカイブ内に存在するファイルの内容は、同一オフセットには同一のデータが入ることが多い。
実装
アーカイブ全体からファイル名部分を検索するのには、有名な Boyer-Moore String Search アルゴリズムを使います。
wiki にソースすらあるので、それを参考にしても良いですが、今回は StackOverflow の記事から使用させていただきました。
参考:Search longest pattern in byte array in C#
ファイル名で区切られた領域をブロックとみなし、ファイル中の全ブロックと全ブロックを比べ、同じオフセットで同じデータ
が入る部分を抽出し、出力は、データブロックと参照ブロックが並ぶ構成にしました。頭の悪い辞書圧縮という感じです。
正確にデータ部分が抽出できれば、PVRTC/ETC1ともに8byteが1blockなので、それを利用して、オフセットによらず圧縮テクスチャ特化型辞書圧縮もできそうですが、手間をかけない方針なのでやりません。
結果
| 方法 | サイズ |
|---|---|
| RAW | 4198973 |
| LZ4 | 876341 |
| LZMA | 609787 |
| 圧縮 | 2381911 |
大部分が同じデータなのでだいたい半分にはなりましたが、通常の圧縮をしていないのでまだまだ大きいですね。
(4)へ続く。