Vermeiden Sie doppelte Komprimierung von Ressourcen

13

Ich verwende .pngs für meine Texturen und verwende ein virtuelles Dateisystem in einer .zipDatei für mein Spielprojekt. Das bedeutet, meine Texturen werden zweimal komprimiert und dekomprimiert. Was sind die Lösungen für dieses Problem der doppelten Komprimierung? Eine Lösung, von der ich gehört habe, ist die Verwendung von .tgas für Texturen, aber es scheint eine Ewigkeit her zu sein, seit ich das gehört habe. Eine andere Lösung besteht darin, die Dekomprimierung auf der zu implementieren GPUund, da dies schnell geht, den Overhead zu vergessen.

user1095108
quelle
2
Verwandte: Wenn Sie JPEGs verwendet haben, dann sind viele Zip-Programme mit ihrem eigenen Format in der Lage, auch diese um 20% zu komprimieren, so dass es nicht unbedingt so schlimm ist. Was ist der Punkt in der doppelten Komprimierung, über den Sie sich am meisten Sorgen machen? Dauert es zu lange Viele Formate speichern bereits komprimierte Daten sogar nur wörtlich und dekomprimieren sie überhaupt nicht.
PlasmaHH

Antworten:

17

Das zip-Format unterstützt verschiedene Komprimierungsalgorithmen. Sie können für jede Datei im Archiv einen anderen Algorithmus verwenden. Wenn Sie bereits komprimierte Dateien, für die keine zusätzliche Komprimierung erforderlich ist (z. B. PNG), in einem Zip-Archiv speichern möchten, können Sie diese Dateien mit dem Algorithmus "Gespeichert" codieren, der überhaupt keine Komprimierung vornimmt. Im "Add to archive" -Dialog von 7-zip können Sie dies unter "Compression strength" auswählen.

Wenn Sie jedoch nicht nur Bilder, sondern auch andere, komprimierbarere Ressourcen in Ihren Archiven haben, kann es ziemlich mühsam sein, den Algorithmus für jede einzelne Datei auszuwählen. In diesem Fall entscheiden Sie sich möglicherweise eher für ein unkomprimiertes Bildformat in einem komprimierten Archiv.

Das TGA-Format kennt viele verschiedene Modi, von denen einige komprimiert sind und andere nicht. Wenn Sie keine Komprimierung verwenden möchten, stellen Sie sicher, dass Sie in den Exportoptionen des verwendeten Grafikeditors die richtige auswählen. Ein weiteres nicht komprimiertes Bildformat ist BMP (Windows Bitmap).

Hier ist ein Test, den ich gemacht habe. Ich habe das gleiche Bild (ein Asset aus meinem aktuellen Projekt) in verschiedenen Formaten mehrmals in ein Zip-Archiv eingefügt, einige mit "Deflate" -Algorithmus bei normaler Stärke und eines mit "Store". Sorry für die deutsche GUI. 2. Spalte ist nicht komprimierte Größe, 3. Spalte ist Kompressionsalgorithmus und 4. Spalte ist komprimierte Größe.

Bildbeschreibung hier eingeben

Wie Sie sehen, hat die Deflationierung des PNG nur magere 0,3% eingespart, während die Deflationierung des BMP auf ein Zehntel der Originaldatei reduziert wurde, die sogar noch kleiner als die PNG-Version ist. Das hat mich ziemlich überrascht. Ich hätte erwartet, dass das PNG kleiner ist, da die Komprimierungsmethode von PNG für Bilddaten optimiert werden sollte, während dies bei ZIP nicht der Fall ist. Eine wahrscheinliche Erklärung ist, dass mein Bildeditor (GIMP) PNG-Dateien ziemlich viele Metainformationen hinzugefügt hat, was für BMP nicht der Fall ist.

Unkomprimiertes TGA verhielt sich vor und nach dem Zippen hinsichtlich der Dateigröße ähnlich wie BMP, während die Komprimierung der komprimierten TGA-Datei durch ZIP weiter verbessert wurde, allerdings nicht so stark wie bei den unkomprimierten Versionen.

Es könnte sich lohnen, mit anderen Algorithmen als der Deflation und mit anderen Einstellungen für die Druckfestigkeit zu experimentieren. Welche Kombination die besten Ergebnisse erzielt, hängt wahrscheinlich vom Stil Ihrer Texturen ab. Sie können aber auch in Betracht ziehen, das Laden von Assets in Ihrem Spiel zu vergleichen und die Dekomprimierungsleistung zu beeinflussen, welche Einstellung Sie verwenden.

Bottom-line: Wenn Sie möchten , doppelt Kompression zu vermeiden , während immer noch eine geringe Dateigröße haben, verwenden Sie entweder PNGmit StoreZip - Algorithmus oder BMPmit einem Komprimieren Zip - Algorithmus.

Philipp
quelle
5
Ich habe es auf einigen meiner Bilder gemacht und PNG (Komprimierungsstufe 9) hat Zip (Komprimierungsstufe Ultra) von BMP-Bildern die ganze Zeit um etwa 20% geschlagen. Es sollte also ein Effekt wie Metainformation sein.
Trilarion
3
png verfügt über eine Interlacing-Option, die die Komprimierbarkeit verringert, es jedoch ermöglicht, ein Bild mit niedriger Auflösung nur aus dem ersten Teil der Bilddatei zu extrahieren (wie beim Herunterladen über eine Verbindung mit niedriger Bandbreite). Hatte Ihre Pinnwand diese Option aktiviert? Außerdem verwendet png bereits deflate für die Komprimierung.
Ratschenfreak
Es sieht so aus, als hätten Sie einen schlechten PNG-Kompressor verwendet. Führen Sie Ihre Dateien durch PNGOUT und Sie sollten ein Ergebnis erhalten, das von einer gezippten BMP-Datei nicht übertroffen wird.
aaaaaaaaaaa
Sind Ihre BMPs oder TGAs 24-Bit oder 32-Bit? Insbesondere bei BMP ist die Wahrscheinlichkeit höher, dass es sich um 24-Bit handelt, und die unkomprimierte TGA-Größe legt nahe, dass dies auch 24-Bit ist. Wahrscheinlich vergleichen Sie hier nicht das Gleiche mit dem Gleichen.
Maximus Minimus
@JimmyShelter Sowohl der TGA als auch der BMP sind 32bit mit Alphakanal - ich habe dafür gesorgt.
Philipp
7

Mach dir keine Sorgen.

Wenn der in ZIP-Dateien verwendete "Deflate" -Algorithmus auf einen Datenblock stößt, der bereits gut komprimiert ist, wie z. B. die Pixeldaten eines PNG-Bilds, stellt er fest, dass er nicht effektiv komprimiert werden kann, und speichert ihn als Literal unkomprimierte Daten. Das Kopieren nimmt am Ende der Dekomprimierung nur sehr wenig Zeit in Anspruch.

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

Russell Borogove
quelle
3
Manchmal ist es so einfach, dass ein wahrgenommenes Problem nicht unbedingt ein echtes Problem ist. Selbst wenn es tatsächlich einen Mehraufwand für das zweimalige Dekomprimieren gäbe, ist das Dekomprimieren der Luft eine sehr schnelle Operation. Ich denke, der Mehraufwand wäre nur messbar.
aaaaaaaaaaa
Würde es lange dauern, bis das Komprimierungsende feststellt, dass die Datei nicht komprimierbar ist?
user253751
Relativ ja. Ich weiß nicht, welche Heuristiken typische .zip-Komprimierer verwenden, um die Codierung eines Blocks auszuwählen, aber es könnte so einfach sein, alle Codierungen auszuprobieren und das beste Ergebnis zu erzielen. Während der Entwicklung, wenn Sie müssen Ihre Daten in einer .zip haben, werden Sie wahrscheinlich alles zwingen , verwenden möchten , storeanstatt deflatezu sparen Zeit, dann deflatealles für Release - Builds.
Russell Borogove
2

Es sieht so aus, als ob bereits einige sehr gute Antworten gegeben wurden, aber ich dachte, ich würde noch eine geben:

What are the solutions to this double compression problem?

Lösung: Nichts tun.

Begründung: Es wurde kein Problem festgestellt - ja, Sie komprimieren die Informationen zweimal, aber warum machen Sie sich darüber Sorgen? Ist die Datengröße zu groß? Ist die Dekompression zu langsam? Ist dies mehr oder weniger wichtig als die Dutzende von Funktionen, die Sie zu diesem Zeitpunkt hinzufügen, verfeinern, testen und / oder debuggen könnten?

NPSF3000
quelle
Etwas zweimal unnötig zu tun ist ein Problem an sich. Zumindest habe ich es als solches empfunden. Aber natürlich haben auch Sie mit Ihrem Vorschlag Recht. Sowohl die Speicher- als auch die Dekomprimierungsgeschwindigkeit können ein Problem sein, wenn auch nicht in diesem Fall, da ich kein kommerzielles Spiel schreibe.
user1095108
Ich bin ein professioneller Spieleentwickler, und ich kann Ihnen versichern, dass wir, wenn es keine echten, dokumentierten Leistungsprobleme gäbe, keine Sekunde damit verschwenden würden - es sind viele Einkäufe oder Anzeigenimpressionen in Höhe von 0,99 USD erforderlich, um das Sagen zu haben, 8 Stunden, um dieses Problem zu beheben. Etwas zweimal zu machen ist kein Problem, obwohl es ineffizient sein könnte. In diesem Fall machen Sie nicht zweimal dasselbe - Sie haben Bilddaten, die als PNG für die Komprimierung gespeichert werden, und eine ganze Reihe von Dateien, die zusammen archiviert werden.
NPSF3000
Stimmt, aber wenn es fertig ist, ist es für mehrere Projekte erledigt. Wenn Sie über den DEFLATE-Algorithmus nachdenken, ist er seit den achtziger Jahren gleich geblieben. Sie wären ein alter Hase, wenn Sie damals programmiert hätten, aber wenn Sie den Algorithmus kennen, könnten Sie ihn beispielsweise auf der GPU implementieren und superschnelle Dekomprimierungsgeschwindigkeiten für mehrere Projekte erzielen.
user1095108
Sie verbringen also 2 Wochen im Monat damit, Deflate für die GPU zu implementieren? Und dann stellen Sie fest, dass Sie sich gerade auf Plattform X als auf Y bereitstellen und Ihren Algorithmus über Z unterbrechen. Wenn Sie Spiele erstellen möchten, machen Sie sich keine Sorgen über unnötige Dinge wie Leistungseinbußen.
NPSF3000
Sobald Sie einen Algorithmus kennen, sollte die (erneute) Implementierung einfach sein. Ein Kinderspiel, nicht 2 Wochen oder einen Monat. Das wollte ich sagen. Es gibt es schon seit den achtziger Jahren, es könnte sich lohnen, etwas Zeit in es zu investieren.
user1095108
1

Wenn Sie spezielle Formate wie PNG und OGG verwenden, müssen Sie ZIP nicht komprimieren.

PNG, OGG und andere bereits komprimierte Formate werden nicht viel kleiner, wenn sie erneut als ZIP komprimiert werden. 100 MB komprimierter PNGs sind immer noch ~ 100 MB.

Skripte, Konfigurationsdateien und andere textbasierte Formate profitieren in hohem Maße von der Komprimierung. Sie sind jedoch normalerweise winzig und speichern nicht so viele Daten. Wenn Ihr Spiel 100 MB groß ist, machen die Textdateien möglicherweise 1 MB des gesamten Spiels aus, auch wenn Sie durch Komprimierung 100 KB erreichen können, haben Sie nur 900 KB gewonnen, weniger als 1%, und sind den Aufwand kaum wert.

Möglicherweise möchten Sie das Dateisystem sogar direkt verwenden, anstatt ein virtuelles, zip-basiertes Dateisystem zu verwenden. Es würde das Patchen sehr einfach machen: Sie können einfach alle Dateien austauschen, die Sie geändert haben.

API-Biest
quelle
2
Manchmal hat man keine Wahl, ob man eine .zipDatei verwenden soll oder nicht. Auf der Android-Plattform ist das .apkbeispielsweise eine .zipDatei, die Ressourcen enthalten kann.
user1095108
3
Darüber hinaus bietet die Verwendung eines Archivs bestimmte Vorteile , und ZIP-Dateien bieten sowohl Komprimierungs- als auch Archivstruktur.
MrCranky
Ja, ich weiß, ich sage nur, dass die Verwendung des nativen Dateisystems auch Vorteile hat. Ich bin ein bisschen ein Verfechter von "Keep it simple".
API-Beast