unityでいってみよう!

unityがチョットワカル位の人のブログ

【2020年度版】モバイルプラットフォームお勧めTexture圧縮形式

はじめに

Unityでは色々なTexture Formatに対応していますが、皆さんは何を使用していますか。 年を追う毎に新しいTextureフォーマットに対応した端末がリリースされるので非常に流動的なのですが、今回は2020年5月の時点でのお勧めTextureフォーマットに関する内容です。

端末が対応していない場合のリスク

選択したTextureフォーマットに端末が対応していなかった場合どうなるかですが、Textureが表示されなくなる訳ではなくRGBA32の形式に変換されます。(ここだけの話しではないですが、当初予定していたものが使用出来ずに別の物で代用することをフォールバックと言います。UnityではShaderにもフォールバックの機能がありますよね) どんな形式を選択してもTextureが表示されないという問題は回避出来るのですが、これにより非常に重要な問題が発生します。

  • RGBA32に変換時にCPUスパイクが発生する
  • メモリの使用量が尋常ではない。

後者が特にクリティカルな問題でフォールバックが発生したということはすなわち、開発者が想定しているものより端末のスペックが低いことを意味します。最悪のケースとしてはフォールバックにより、メモリ不足となりそのままアプリケーションの強制終了というコンボが発生する可能性も考慮しておいた方が良いかもしれません。 マニュアルによるとTexture本体とRGBA32形式の両方をメモリに2重に確保すると記載されている為、メモリーをギリギリまでチューニングしているとかなりの確率で発生しそうです。

また、圧縮形式がETC2の場合、Override ETC2 fallbackという項目でフォールバック時の形式にRGBA32以外も指定可能です。 マニュアルから読み解く限り、Override ETC2 fallbackはCompressed ETC2だけではなく、Crunched ETC2にも対応している模様です。(今回は検証していなので断言できません。)

結論

iOSの場合

Compressed ASTC6x6 block

iPhone6(A8 chip)より前のモデルを切り捨てることが出来るかが大きなポイントになります。 2020年現在開発中のアプリであれば、iPhone6より前の端末は切り捨ててもマーケティング的に影響は少ないと判断します。 サイズと品質のバランスから6x6をチョイスしましたが、開発に余裕があるならば、どれだけアップで表示されるかに応じて4x4~12x12を使い分けるのも良いかもしれません。

4x4~12x12による品質の違いは下記が判りやすいです。 tsubakit1.hateblo.jp

Androidの場合

Crunched ETC2

ARMの資料(ARM Unity 開発者ガイド ver3.2)によると、ARM Mali GPUのお勧めはASTCなのですが、現時点でASTCに対応していない端末を切り捨てるのは非常に厳しい状況です。ASTCはOpenGLES 3.1+AEP以上、もしくはGL_KHR_texture_compression_astc_ldrに対応している必要があり、下記のURLで対応の状況を確認可能です。

developer.android.com opengles.gpuinfo.org

Crunched形式が使用するファイルサイズ、メモリサイズはこちらが判りやすいです。 nakamura001.hatenablog.com

おまけ

各デバイスがUnityがサポートしているTextureの圧縮形式に対応しているか否かはSystemInfo.SupportsTextureFormat() APIから確認可能です。 docs.unity3d.com

Textureフォーマットに関する公式ドキュメント docs.unity3d.com