リソースの二重圧縮を避ける


13

私は使用しています.png私のテクスチャにSをして、仮想ファイルシステムを使用しています.zip私のゲームプロジェクトのためのファイル。これは、テクスチャが2回圧縮および解凍されることを意味します。この二重圧縮の問題の解決策は何ですか?私が聞いた解決策の1つは.tga、テクスチャにs を使用することです。別の解決策は、圧縮解除を実装するGPUことです。これは高速なので、オーバーヘッドを忘れてください。


2
関連:jpegを使用した場合、独自の形式の多くのzipプログラムは、それらを20%圧縮することができるため、必ずしもそれほど悪いわけではありません。あなたが最も心配している二重圧縮のポイントは何ですか?時間がかかりすぎませんか?多くのフォーマットは、すでに圧縮されたデータをそのまま逐語的に保存し、それらの圧縮を全く行いません。
PlasmaHH

回答:


17

zip形式は、いくつかの異なる圧縮アルゴリズムをサポートしています。アーカイブ内のファイルごとに異なるアルゴリズムを使用できます。追加の圧縮(PNGなど)の恩恵を受けない圧縮済みのファイルをzipアーカイブに保存する場合は、これらのファイルをまったく圧縮しない「保存済み」アルゴリズムでエンコードできます。7-zipの [アーカイブに追加]ダイアログでは、[ 圧縮強度]でこれを選択できます。

しかし、アーカイブだけでなく画像だけでなく他のより圧縮可能なリソースがある場合、すべてのファイルにアルゴリズムを選択するのは非常に面倒です。その場合、圧縮アーカイブで圧縮されていない画像形式を選択することもできます。

TGA形式は多くの異なるモードを認識しており、そのうちのいくつかは圧縮されており、いくつかは圧縮されていません。圧縮を使用しない場合は、使用しているグラフィックエディターのエクスポートオプションで正しい圧縮を選択してください。別の非圧縮画像形式は、BMP(Windowsビットマップ)です。

これが私が作ったテストです。同じイメージ(現在のプロジェクトのアセット)を異なる形式で複数回zipアーカイブに追加しました。一部は「deflate」アルゴリズム、通常は強度、もう1つは「store」です。ドイツのGUIでごめんなさい。2列目は非圧縮サイズ、3列目は圧縮アルゴリズム、4列目は圧縮サイズです。

enter image description here

ご覧のとおり、PNGのdeflateエンコードはわずか0.3%しか節約できませんが、deflateエンコードのBMPはPNGバージョンよりもさらに小さい元のファイルの1/10に削減されます。これは非常に驚きました。PNGの圧縮方法は画像データ用に最適化する必要がありますが、ZIPはそうではないため、PNGが小さくなると予想していました。おそらく、私のイメージエディター(GIMP)は、BMPにはしないPNGファイルに非常に多くのメタ情報を追加したということです。

圧縮されたTGAファイルの圧縮はZIPによってさらに改善されましたが、圧縮されていないバージョンほどではありませんが、圧縮されていないTGAは圧縮前後のファイルサイズに関してBMPと同様に動作しました。

deflate以外のアルゴリズムおよび他の圧縮強度設定を試してみる価値があるかもしれません。どの組み合わせが最良の結果をもたらすかは、おそらくテクスチャのスタイルによって異なります。ただし、ゲームのアセット読み込みのベンチマークを検討し、使用する設定に応じて圧縮解除のパフォーマンスを決定することもできます。

結論:ファイルサイズが小さいままで二重圧縮を避けたい場合はPNGStorezipアルゴリズムまたはBMP圧縮zipアルゴリズムを使用します。


5
私はいくつかの私の写真とPNG(圧縮レベル9)でBMP画像のzip(圧縮レベルultra)を常に約20%ビートしました。したがって、メタ情報のような効果である必要があります。
トライラリオン

3
pngには圧縮率が低下するインターレースオプションがありますが、画像ファイルの最初の部分から低解像度画像を抽出できます(低帯域幅接続でダウンロードする場合など)、あなたの壁はそれをアクティブにしましたか?それに加えて、pngはすでに圧縮にdeflateを使用しています。
ラチェットフリーク

貧弱なpngコンプレッサーを使用しているようで、ファイルにPNGOUTを実行すると、圧縮されたbmpファイルに負けない結果が得られるはずです。
aaaaaaaaaaaa

BMPまたはTGAは24ビットですか、32ビットですか?特にBMPの場合、それらは24ビットである可能性が高く、非圧縮のTGAサイズは24ビットであることを示唆しています。おそらくここではlike-with-likeを比較していないでしょう。
マキシマスミニマス

@JimmyShelter TGAとBMPはどちらもアルファチャネル付きの32ビットです。
フィリップ

7

心配しないでください。

.zipファイルで使用される「deflate」アルゴリズムが、.png画像のピクセルデータなど、既に十分に圧縮されたデータブロックに遭遇すると、効果的に圧縮できないことがわかり、リテラルとして保存されます。非圧縮データ。これにより、コピーアウトするための解凍終了時のオーバーヘッドがほとんどかかりません。

http://en.wikipedia.org/wiki/DEFLATE


3
簡単なことですが、認識されている問題は必ずしも実際の問題ではありません。実際に2回の圧縮解除のオーバーヘッドがあったとしても、圧縮解除は非常に迅速な操作であり、オーバーヘッドは測定可能なだけだと思います。
aaaaaaaaaaaa

ファイルが圧縮可能でないことを認識するのに、圧縮の終了に長い時間がかかりますか?
user253751

比較的、はい。典型的な.zipコンプレッサーがブロックのエンコーディングを選択するためにどのようなヒューリスティックを使用するのかわかりませんが、すべてのエンコーディングを試して最良の結果を維持するのと同じくらい簡単かもしれません。開発中にデータを.zipで保存する必要がある場合、時間を節約するstore代わりにすべてを強制的に使用し、リリースビルドではすべてを使用する必要があります。deflatedeflate
ラッセルボロゴーブ

2

いくつかの非常に良い答えが既に与えられているように見えますが、私はもう一つ与えたいと思いました:

What are the solutions to this double compression problem?

解決策:何もしないでください。

根拠:問題はありませんでした-はい、情報を2回圧縮していますが、なぜこれを心配していますか?データサイズが大きすぎませんか?減圧は遅すぎますか?これは、現時点で追加、改良、テスト、および/またはデバッグできる多数の機能よりも重要ですか?


不必要に2回何かをすること自体が問題です。少なくとも私はそれをそのように感じました。しかし、もちろん、あなたもあなたの提案に正しいです。私は商用ゲームを書いていないので、この場合ではありませんが、メモリと解凍速度の両方が問題になる可能性があります。
user1095108

私はプロのゲーム開発者であり、実際に文書化されたパフォーマンスの問題がない限り、これについて心配する必要はありません-言うのに支払うには0.99ドルの購入または広告のインプレッションがかかります8この問題を適切に「修正」する時間。何かを2回行うことは問題ではありませんが、非効率的かもしれません。この場合、同じことを2回行っているわけではありません-圧縮用のPNGとして保存されている画像データと、一緒にアーカイブされているファイル全体があります。
NPSF3000

確かに、それが完了すると、複数のプロジェクトで行われます。DEFLATEアルゴリズムについて考えると、80年代から変わらないままです。プログラミングした場合、あなたは古い文法になりますが、アルゴリズムを知っていれば、たとえば、GPUに実装して、複数のプロジェクトで超高速の解凍速度を楽しむことができます。
user1095108

GPUにDeflateを実装するのに1か月で2週間かかりますか?そして、YよりもプラットフォームXにデプロイしようとしているだけで、Zを介してアルゴリズムを壊していることに気づきます。ゲームを作成する場合、FOCUS ON MAKING GAMES、パフォーマンスの低下などの不必要なことを心配しないでください。
NPSF3000

アルゴリズムを(再)実装すれば、簡単に実行できるはずです。2週間または1か月ではなく、簡単です。それが私が言いたかったことです。80年代から存在しており、それに時間をかけることは価値があるかもしれません。
user1095108

1

PNGやOGGなどの特殊な形式を使用する場合、ZIPの圧縮は必要ありません。

PNG、OGG、およびその他の既に圧縮されている形式は、ZIPとして再度圧縮してもそれほど小さくなりません。圧縮された100MBのPNGは、まだ〜100MBです。

スクリプト、構成ファイル、およびその他のテキストベースの形式は、圧縮の恩恵を大いに受けますが、通常、それらは比較的小さく、それほど多くのデータを保存しません。ゲームが100MBの場合、テキストファイルはゲーム全体の1MBになる可能性があります。たとえ圧縮によって100KBにできたとしても、1%未満の900KBしか獲得できず、努力の価値はほとんどありません。

仮想のzipベースのファイルシステムを使用する代わりに、ファイルシステムを直接使用することもできます。パッチを適用するのは非常に簡単です。変更したファイルを交換するだけです。


2
.zipファイルを使用するかどうかに関して、選択肢がない場合もあります。たとえば、Androidプラットフォームでは、.apk.zipファイルであり、リソースが含まれている場合があります。
user1095108

3
さらに、アーカイブを使用することには明確な利点があり、ZIPファイルは圧縮とアーカイブ構造の両方を提供します。
MrCranky

はい、知っています。ネイティブファイルシステムを使用することには利点もあると言っているだけです。私は少し「シンプルに保つ」擁護者です。
APIビースト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.