Évitez la double compression des ressources

13

J'utilise .pngs pour mes textures et j'utilise un système de fichiers virtuel dans un .zipfichier pour mon projet de jeu. Cela signifie que mes textures sont compressées et décompressées deux fois. Quelles sont les solutions à ce problème de double compression? Une solution dont j'ai entendu parler est d'utiliser .tgas pour les textures, mais cela semble il y a longtemps, depuis que j'ai entendu cela. Une autre solution consiste à implémenter la décompression sur le GPUet, puisque c'est rapide, à oublier la surcharge.

user1095108
la source
2
En relation: si vous avez utilisé des fichiers jpeg, de nombreux programmes zip avec leur propre format sont capables de compresser même ceux de 20%, ce n'est donc pas nécessairement si mauvais. Quel est le point de la double compression qui vous inquiète le plus? Cela prend-il trop de temps? De nombreux formats stockent même des données déjà compressées uniquement textuellement et ne les décompressent pas du tout.
PlasmaHH

Réponses:

17

Le format zip prend en charge plusieurs algorithmes de compression différents. Vous pouvez utiliser un algorithme différent pour chaque fichier de l'archive. Lorsque vous souhaitez stocker des fichiers déjà compressés qui ne bénéficient pas d'une compression supplémentaire (comme PNG) dans une archive zip, vous pouvez encoder ces fichiers avec l'algorithme "stocké" qui ne se comprime pas du tout. La boîte de dialogue "Ajouter aux archives" de 7-zip vous permet de choisir ceci sous "Force de compression".

Mais lorsque vous avez non seulement des images mais également d'autres ressources plus compressibles dans vos archives, il peut être assez fastidieux de choisir l'algorithme pour chaque fichier. Dans ce cas, vous pouvez plutôt opter pour un format d'image non compressé dans une archive compressée.

Le format TGA connaît de nombreux modes différents, dont certains sont compressés et d'autres non. Lorsque vous ne souhaitez pas utiliser la compression, assurez-vous de choisir la bonne dans les options d'exportation de l'éditeur graphique que vous utilisez. Un autre format d'image non compressé est BMP (Windows Bitmap).

Voici un test que j'ai fait. J'ai ajouté plusieurs fois la même image (un atout de mon projet actuel) dans différents formats à une archive zip, certaines avec l'algorithme "dégonfler" à force normale et une avec "stocker". Désolé pour l'interface graphique allemande. La 2e colonne est de taille non compressée, la 3e colonne est un algorithme de compression et la 4e colonne est de taille compressée.

entrez la description de l'image ici

Comme vous pouvez le voir, l'encodage dégonflé du PNG n'a enregistré qu'une maigre 0,3%, tandis que le BMP encodé dégonflé est réduit à un dixième du fichier d'origine, ce qui est encore plus petit que la version PNG. Cela m'a vraiment surpris. Je m'attendais à ce que le PNG soit plus petit car la méthode de compression du PNG devrait être optimisée pour les données d'image alors que le ZIP ne l'est pas. Une explication probable est que mon éditeur d'images (GIMP) a ajouté beaucoup de méta-informations aux fichiers PNG, ce qu'il ne fait pas pour BMP.

TGA non compressé se comportait de manière similaire à BMP en ce qui concerne la taille des fichiers avant et après la fermeture éclair tandis que la compression du fichier TGA compressé était encore améliorée par ZIP, mais pas autant que les versions non compressées.

Il pourrait être utile d'expérimenter avec d'autres algorithmes que le dégonflage et avec d'autres paramètres de résistance à la compression. La combinaison qui donnera les meilleurs résultats dépendra probablement du style de vos textures. Mais vous pouvez également envisager de comparer le chargement des ressources de votre jeu et faire en sorte que les performances de décompression influencent votre décision concernant le paramètre que vous utilisez.

Conclusion: lorsque vous souhaitez éviter la double compression tout en ayant une taille de fichier faible, utilisez-la PNGavec un Storealgorithme zip ou BMPavec un algorithme de compression zip.

Philipp
la source
5
Je l'ai fait sur certaines de mes photos et PNG (niveau de compression 9) a battu le zip (niveau de compression ultra) des images BMP tout le temps d'environ 20%. Il devrait donc s'agir d'un effet comme la méta-information.
Trilarion
3
png a une option d'entrelacement avec une compressibilité réduite mais permet d'extraire une image basse résolution de la première partie du fichier image (comme lors du téléchargement via une connexion à faible bande passante), votre mur était-il actif? en plus de cela, png utilise déjà le dégonflage pour sa compression.
monstre à cliquet
Il semble que vous ayez utilisé un mauvais compresseur png, exécutez vos fichiers via PNGOUT et vous devriez obtenir un résultat qui ne sera pas battu par un fichier bmp zippé.
aaaaaaaaaaaa
Vos BMP ou TGA sont-ils 24 bits ou 32 bits? Avec BMP en particulier, ils sont plus susceptibles d'être 24 bits, et la taille TGA non compressée suggère que c'est également 24 bits. Vous ne comparez probablement pas à l'identique ici.
Maximus Minimus
@JimmyShelter Le TGA et le BMP sont tous deux 32 bits avec canal alpha - je m'en suis assuré.
Philipp
7

Ne t'en fais pas.

Lorsque l'algorithme de «dégonflage» utilisé dans les fichiers .zip rencontre un bloc de données déjà bien compressé, comme les données de pixels d'une image .png, il constate qu'il ne peut pas le compresser efficacement, et il le stockera comme littéral données non compressées. Cela prend très peu de temps à la fin de la décompression pour copier.

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

Russell Borogove
la source
3
Parfois, c'est aussi simple qu'un problème perçu n'est pas nécessairement un vrai problème. Même s'il y avait en fait le surcoût de la décompression à deux reprises, la décompression du dégonflage est une opération très rapide, je suppose que le surcoût ne serait que mesurable.
aaaaaaaaaaaa
La fin de la compression prendrait-elle beaucoup de temps pour réaliser que le fichier n'est pas compressible?
user253751
Relativement, oui. Je ne sais pas quelle heuristique les compresseurs .zip typiques utilisent pour choisir l'encodage d'un bloc, mais cela pourrait être aussi simple que d'essayer tous les encodages et de conserver le meilleur résultat. Pendant le développement, si vous devez avoir vos données dans un .zip, vous voudrez probablement forcer tout à utiliser storeau lieu de deflategagner du temps, puis deflatetout pour les versions.
Russell Borogove
2

On dirait que de très bonnes réponses ont déjà été données, mais j'ai pensé en donner une de plus:

What are the solutions to this double compression problem?

Solution: ne faites rien.

Justification: Aucun problème n'a été signalé - oui, vous compressez les informations deux fois, mais pourquoi vous en inquiétez-vous? La taille des données est-elle trop grande? La décompression est-elle trop lente? Est-ce plus ou moins important que les dizaines de fonctionnalités que vous pourriez ajouter, affiner, tester et / ou déboguer en ce moment?

NPSF3000
la source
Faire quelque chose deux fois inutilement est un problème en soi. Au moins, je l'ai perçu comme tel. Mais, bien sûr, vous avez également raison dans votre suggestion. La mémoire et la vitesse de décompression peuvent être un problème, mais pas dans ce cas, car je n'écris pas de jeu commercial.
user1095108
Je suis un développeur de jeux professionnel, et je peux vous assurer qu'à moins qu'il n'y ait de vrais problèmes de performance documentés, nous ne perdrions pas une seconde à nous en préoccuper - cela prend beaucoup de 0,99 $ d'achats ou d'impressions publicitaires pour payer le mot à dire, 8 heures pour «corriger» correctement ce problème. Faire deux fois quelque chose n'est pas un problème, bien que cela puisse être inefficace. Bien que dans ce cas, vous ne fassiez pas la même chose deux fois - vous avez des données d'image qui sont stockées au format PNG pour la compression et tout un tas de fichiers qui sont archivés ensemble.
NPSF3000
C'est vrai, mais une fois que c'est fait, c'est fait pour plusieurs projets. Si vous réfléchissez à l'algorithme DEFLATE - il est resté le même depuis les années quatre-vingt. Vous seriez un vieux gramps, si vous aviez programmé à ce moment-là, mais, si vous connaissiez l'algorithme, vous pourriez, par exemple, l'implémenter sur le GPU et profiter de vitesses de décompression ultra-rapides sur plusieurs projets.
user1095108
Vous passez donc, quelles 2 semaines, un mois à implémenter Deflate sur GPU? Et puis vous vous rendez compte que vous êtes sur le point de déployer sur la plate-forme X que Y et casse votre algorithme via Z. Si vous voulez créer des jeux, FOCUS SUR LA FABRICATION DE JEUX, ne vous inquiétez pas de choses inutiles comme dégonfler les performances.
NPSF3000
Une fois que vous connaissez un algorithme (re) implémentant, il devrait être facile. Un clin d'œil, pas 2 semaines ou un mois. Voilà ce que je voulais dire. Cela existe depuis les années 80, investir du temps pourrait être utile.
user1095108
1

Si vous utilisez des formats spécialisés tels que PNG et OGG, vous n'aurez pas besoin de la compression de ZIP.

PNG, OGG et autres formats déjà compressés ne seront pas beaucoup plus petits en les compressant à nouveau au format ZIP. 100 Mo de PNG compressés sont toujours ~ 100 Mo.

Les scripts, les fichiers de configuration et d'autres formats basés sur du texte bénéficient grandement de la compression, cependant, ils sont généralement minuscules en comparaison, ils ne stockent pas autant de données. Si votre jeu est de 100 Mo, alors les fichiers texte peuvent faire 1 Mo de l'ensemble du jeu, même si vous pouvez les faire 100 Ko par compression, vous n'avez gagné que 900 Ko, moins de 1%, cela ne vaut vraiment pas la peine.

Vous pourriez même vouloir utiliser le système de fichiers directement au lieu d'utiliser un système de fichiers virtuel basé sur zip. Cela rendrait les correctifs très faciles: vous pouvez simplement échanger tous les fichiers que vous avez modifiés.

API-Beast
la source
2
Parfois, on n'a pas le choix, d'utiliser .zipou non un fichier. Par exemple, sur la plateforme Android, le .apkest un .zipfichier, qui peut contenir des ressources.
user1095108
3
De plus, l'utilisation d'une archive présente des avantages certains , et les fichiers ZIP fournissent à la fois une compression et une structure d'archive.
MrCranky
Oui, je sais, je dis simplement que l'utilisation du système de fichiers natif présente également des avantages. Je suis un peu un défenseur de "Keep it simple".
API-Beast