【Unity】画像圧縮とロード方法
PC向けはBC7
DirectX用圧縮テクスチャ規格、DXT
BC7
試した限り、最も画像がキレイで、サイズもそこそこ圧縮された(公称 1/4)。
2048x2048px の 12MB の画像を RGBA Compressed BC7 UNorn で圧縮すると、
4MBまで落ちた。
iOS/Android向けはASTC4x4
iPhone6以降、Androidはここ最近のものなら大体行ける形式らしい。
AddressableAsset における組み込みについて
シーン紐づけの場合
同アセットを別オブジェクトに直接紐づけ
- bundle圧縮後にサイズは変わらない。ひとつの画像を参照。
- 直接紐づけというのは、直接画像をアタッチするという意味。
- 間接的紐づけは AssetReference を使う。
- 直接だと同じbundleにまるごと格納される。
間接では別のGroupから該当アセットをロードしないと表示されない。
アセット紐づけの場合
- 試してはいないが、恐らくシーンと同様の扱いになると思われる。
- そうでないと依存性がおかしくなる。
- ちなみにアセットに直接別アセットをアタッチすると丸ごとパックされる。
それが嫌ならAssetReferenceでバラバラに切り離す。
- AssetReferenceは参照指定するだけなので結構めんどい。
アドレスIDを文字列で記入するか、位置を指定するか。
- AssetReferenceは参照指定するだけなので結構めんどい。
現時点での運用案
- 依存性がプロファイラに表示されないが、
シーンに「使うアセットを直接紐付けるオブジェクト」を配置して、
そこにデータをまとめて、シーンロード時に丸ごと自動ロード。
- シーンはAddressableからLoadSceneAsyncでロードする。
- 後からInstantiateしないなら直接配置してもOK。
- データベースに必ず使うアセットを直接アタッチして、関連シーンで丸ごとロード。
- これでアタッチした変数から直接 Instantiate できる。
AddressableAsset を Resources に近い使い方で運用できるように。
- これでアタッチした変数から直接 Instantiate できる。
なぜタグを使わないか
- タグを使って関連アセットを丸ごとロードする場合、
どういう順で格納されるか不明な AsyncOperationHandle リストにロードされる。 - どこに何が入ってるか探すのが面倒。
- シーン破棄で丸ごと消える InstantiateAsync を使うなら良いけど、
自分でオブジェクトを実体化して破棄する際にかなり面倒。
- プリロードしておくと、Instantiate と Destroy が使える。
※プリロードすると InstantiateAsync が必要なくなる。
- プリロードしておくと、Instantiate と Destroy が使える。
- 欠点としては、自分で管理することになるのでミスする可能性が上がる
- まぁAddress文字列を直接書き込むよりはよい気はする
- あくまでも自己流なので保証できません。