読者です 読者をやめる 読者になる 読者になる

n-yoda's blog

主にUnity3Dに関するあんまり技術的じゃないメモ的な何かを書いています。

ディザ処理をした16bitsテクスチャはディスク上での容量が大きいかもしれない話

結論から言うと、「16 bpp + ディザ処理」というのはあくまでもメモリ消費を抑えるためのものであって、圧縮を考慮するとディスク上でのサイズはむしろ大きくなる場合があるという話です。

ここに512x512のTexture f:id:yoda_n:20150128020500p:plain があります。

f:id:yoda_n:20150128020446p:plain

Format をTruecolor (32 bits) に設定したので 512 * 512 * 4 byte = 1 MB のメモリを消費します。

次に、メモリ使用を抑えるために、Format を「16 bits」に設定します。

f:id:yoda_n:20150128020138p:plain

今度は、512 * 512 * 2 byte = 0.5 MB になりました。


しかしこれでは画質が今ひとつなのでディザ処理をして綺麗にしましょう。
(これを使わせて頂きました:keijiro/unity-dither4444 · GitHub

f:id:yoda_n:20150128020413p:plain

きれいな画質のままメモリ使用を抑えることが出来たのでめでたしめでたし…と言いたいところですが、ディスク上でのサイズはどうなっているでしょうか。

まず、BinaryWriter 等を使って、上の画像のピクセルデータをバイナリファイルに書き出します。 ファイルサイズを確認すると、上記の通りになることがわかります。

f:id:yoda_n:20150128024115p:plain

次に、Unity は Asset を LZMAで圧縮することが多いので、lzmaコマンドで圧縮してみます。

f:id:yoda_n:20150128024130p:plain

結果はこんな感じです。

  • Truecolor: 1024 KB -> 28 KB
  • 16 bits: 512 KB -> 12 KB
  • 16 bits (dithered): 512 KB -> 104 KB

ディザ処理をした場合の圧縮率が他に比べて相当悪いですね。 これはあくまでも一例ですが、直感的にはランダムなノイズ画像でも無い限りそのような傾向があると思われます(未検証)。エントロピーの増加 = 情報量の増加 = 理論上の最小圧縮容量の増加、なので。

メモリに余裕がある場合は、わざわざディザ処理をしてまで 16 bits の画像を使うべきでは無いかもしれません。