
【cocone TECH TALK VOL.4・後編】2Dスマホゲームにおける圧縮テクスチャ【イベントレポート】
-
2021年10月28日
こんにちは!cocone tech blog編集長のYです!
今回は2021年9月30日に行われた「cocone TECH TALK VOL.4」でお話した内容をまとめたものを前編・後編に分けてご紹介します!
本記事は後編として「2Dスマホゲームにおける圧縮テクスチャ」というテーマについてお話ししていただいた内容を文字起こししたものとなります。
前編をまだ読んでない方はこちらからどうぞ!
【cocone TECH TALK VOL.4・前編】膨大になったDBを何とかする【イベントレポート】
登壇者紹介
圧縮テクスチャって?
着せ替えアプリでは場合によっては10、20、30…と多くのテクスチャを並べて着せ替えを実現しています。
そこで問題となるのが、メモリをたくさん消費してしまうことです。
スマホのアプリだとVRAMがRAMと同じところを参照しているため、テクスチャの描画でメモリを消費しすぎるとアプリとしての消費メモリが大きくなってしまいます。
普段ウェブなどでJPEGやPNGという形式の物を使うことがよくあると思います。実はハードウェア的には元の画像をJPEGに圧縮し、VRAMに乗る時に一度デコードしているため効率が悪い上にメモリ消費も激しいのです。
一方圧縮テクスチャでは元画像を圧縮したものをそのままVRAM上で扱うことができるため、効率がよくメモリ消費も少なくて済みます。
圧縮テクスチャのメリット・デメリット
圧縮テクスチャのメリットをまとめるとこのようになります。
一方でデメリットも存在します。それをまとめたのがこちらです。
圧縮テクスチャの種類とか
次にモバイルで用いられる圧縮テクスチャの種類をご紹介します。
まずはiOSです。
テクスチャ圧縮形式 | サポートしているチップセット |
PVRTC | すべて |
ETC2/EAC | iPhone 5s (A7以降) |
ASTC | iPhone 6 (A8以降) |
https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf
iOSでは現状この3種類を使うことができます。
全てのチップセットで使うことのできるPVRTCはアルファが苦手で、透過&グラデーションなどになると荒が目立ってしまうので注意が必要です。
次にAndroidです。
テクスチャ圧縮形式 | サポートしている Google Play デバイスの割合1 |
ETC1 | 99% |
ETC2 | 87% |
ASTC | 77% |
ATC | 35% |
PVRTC | 11% |
DXT1 | 0.7% |
https://developer.android.com/guide/app-bundle/asset-delivery/texture-compression?hl=ja
(2020 年 9 月にアクティブな Google Play デバイスから収集したデータを使用して算出)
こちらのデータは全世界での割合のため、日本のみでデータを収集した場合ASTCなどの新しい圧縮テクスチャの割合が高くなると思われます。
このようにAndroidで扱える圧縮テクスチャの種類はたくさんありますが、ETC1、ETC2、ASTCを使うことが多いです。
ただ、ETC1はほぼ全ての端末で使用できるのですが、アルファ値を扱えないので注意が必要です。
ではAndroidでASTCをサポートしているチップセットは何があるのでしょうか。
代表的なチップセットはこの4つになります。
- Qualcomm GPUs since Adreno 4xx / Snapdragon 415 (2015)
- ARM GPUs since Mali T624 (2012)
- NVIDIA GPUs since Tegra K1 (2014)
- PowerVR GPUs since GX6250 (2014)
基本的には2015年以降の端末ならばASTC対応していると考えて良さそうです。
ちなみにPVRTC、ETC1時代(5年前くらい)ではこのようなことをしていました。
左側半分をRGB、右側半分はアルファにし、シェーダーでマスクしたものを合わせる、ということをして表現をしていました。
輪郭部分にアルファで黒が滲む問題
こちらは左から順番に元画像、アルファ部分を外しRGBのみにしたもの、PVRTCに圧縮したものになります。
PVRTCの画像をよく見ると黒が滲んでいる場所があります。
これは圧縮する際にブロックに黒が入り、代表色として選ばれてしまったためにこのように黒が滲んでしまうのです。
ではこの黒がにじむ問題をどう対処したかと言いますと、一番外側にある色を外側に広げることで、ETCなどでも正常に描画できるように当時はしていました。
2021年のベタープラクティス
では2021年現在はどの方式を採用するのが良いかというと、最近5,6年以内に発売された端末をターゲットにするのならばiOS/Android共にASTCで良いと思います。
ASTCは圧縮効率もよく、きれいに描画することができます。
また、ASTCではブロックサイズを選択することができるため、画像によって変更できるのがとても便利です。
基本はASTC 6×6、ブロックノイズや劣化が気になるものに関してはASTC 4×4にします。UIのボタンや背景、9Sliceを使うものなどASTC 4×4でも許容できないものに関してはTrue Color RGB24/RGBA32にします。
注意
ASTCテクスチャは一部のAndroid端末で透けてしまうハードウェア的な問題が存在するようなので、ご注意下さい。
Unityでは以下の組み合わせで発生します。
- Adreno GPU 端末
- プロジェクト設定はリニア色空間
- テクスチャの色空間はsRGB
スライド
いかがでしたか?
今回は少しデザイナーさん寄りのテーマでしたので、ご存知なかった方も多いのではないでしょうか?
以上で「cocone TECH TALK VOL.4」後編の振り返りを終わります!
前編をまだ読んでいない方はこちらからぜひご覧ください!
【cocone TECH TALK VOL.4・前編】膨大になったDBを何とかする【イベントレポート】
cocone TECH TALK VOL.5の開催も準備中です!
開催時期が決まり次第、cocone tech blog、Twitterで告知させていただきますのでお楽しみに!
また、ココネでは一緒に働く仲間を募集中です。
ご興味のある方は、以下のリンクからぜひご応募ください。