Evitar la doble compresión de recursos

13

Estoy usando .pngs para mis texturas y estoy usando un sistema de archivos virtual en un .ziparchivo para mi proyecto de juego. Esto significa que mis texturas se comprimen y descomprimen dos veces. ¿Cuáles son las soluciones a este problema de doble compresión? Una solución que he escuchado es usar .tgas para texturas, pero parece que hace años, desde que escuché eso. Otra solución es implementar la descompresión en el GPUy, dado que es rápido, olvidarse de la sobrecarga.

usuario1095108
fuente
2
Relacionado: si usó jpegs, muchos programas zip con su propio formato pueden comprimir incluso esos en un 20%, por lo que no es necesariamente tan malo. ¿Cuál es el punto de la doble compresión que más te preocupa? ¿Tarda demasiado? Muchos formatos incluso almacenan datos ya comprimidos textualmente y no hacen ninguna descompresión en ellos.
PlasmaHH

Respuestas:

17

El formato zip admite varios algoritmos de compresión diferentes. Puede usar un algoritmo diferente para cada archivo en el archivo. Cuando desee almacenar archivos ya comprimidos que no se benefician de una compresión adicional (como PNG) en un archivo zip, puede codificar estos archivos con el algoritmo "almacenado" que no se comprime en absoluto. El cuadro de diálogo "Agregar al archivo" de 7-zip le permite elegir esto en "Fuerza de compresión".

Pero cuando no solo tiene imágenes, sino también otros recursos más comprimibles en sus archivos, puede ser bastante tedioso elegir el algoritmo para cada archivo. En ese caso, puede optar por un formato de imagen sin comprimir en un archivo comprimido.

El formato TGA conoce muchos modos diferentes, algunos de los cuales están comprimidos y otros no. Cuando no desee utilizar la compresión, asegúrese de elegir la correcta en las opciones de exportación del editor gráfico que está utilizando. Otro formato de imagen sin compresión es BMP (Windows Bitmap).

Aquí hay una prueba que hice. Agregué la misma imagen (un activo de mi proyecto actual) en diferentes formatos varias veces a un archivo zip, algunos con el algoritmo "desinflar" en la fuerza normal y uno con "almacenar". Perdón por la GUI alemana. La segunda columna tiene un tamaño sin comprimir, la tercera columna tiene un algoritmo de compresión y la cuarta columna tiene un tamaño comprimido.

ingrese la descripción de la imagen aquí

Como puede ver, la codificación de desinflado del PNG solo ahorró un magro 0.3%, mientras que el BMP codificado por desinflado se reduce a una décima parte del archivo original, que es incluso más pequeño que la versión PNG. Esto me sorprendió bastante. Hubiera esperado que PNG fuera más pequeño porque el método de compresión de PNG debería optimizarse para datos de imagen mientras que ZIP no lo es. Una explicación probable es que mi editor de imágenes (GIMP) agregó una gran cantidad de metainformación a los archivos PNG, lo que no hace para BMP.

TGA sin comprimir se comportó de manera similar a BMP con respecto al tamaño del archivo antes y después de comprimir, mientras que la compresión del archivo TGA comprimido mejoró aún más con ZIP, aunque no tanto como las versiones sin comprimir.

Puede valer la pena experimentar con otros algoritmos que no sean desinflar y con otra configuración de resistencia a la compresión. La combinación que tendrá los mejores resultados probablemente dependerá del estilo de sus texturas. Pero también puede considerar comparar la carga de activos de su juego y hacer que el rendimiento de descompresión influya en su decisión sobre la configuración que utiliza.

En pocas palabras : cuando desee evitar la doble compresión sin dejar de tener un tamaño de archivo bajo, use PNGcon Storeel algoritmo zip o BMPcon un algoritmo zip comprimido.

Philipp
fuente
55
Lo hice en algunas imágenes mías y PNG (nivel de compresión 9) superó el zip (nivel de compresión ultra) de imágenes BMP todo el tiempo en aproximadamente un 20%. Por lo tanto, debería ser un efecto como la metainformación.
Trilarion
3
png tiene una opción de entrelazado que reduce la compresibilidad pero permite extraer una imagen de baja resolución solo de la primera parte del archivo de imagen (como cuando se descarga a través de una conexión de bajo ancho de banda), ¿tenía su muro activo? además de que png ya usa deflate para su compresión.
Ratchet Freak
Parece que ha utilizado un compresor png deficiente, ejecute sus archivos a través de PNGOUT y debería obtener un resultado que no sea superado por un archivo bmp comprimido.
aaaaaaaaaaaa
¿Sus BMP o TGA son de 24 o 32 bits? Con BMP en particular, es más probable que sean de 24 bits, y el tamaño TGA sin comprimir sugiere que también es de 24 bits. Probablemente no estés comparando algo así aquí.
Maximus Minimus
@JimmyShelter Tanto el TGA como el BMP son de 32 bits con canal alfa, me aseguré.
Philipp
7

No te preocupes por eso.

Cuando el algoritmo "desinflar" utilizado en archivos .zip encuentra un bloque de datos que ya está bien comprimido, como los datos de píxeles de una imagen .png, descubre que no puede comprimirlo de manera efectiva, y lo almacenará como literal datos sin comprimir Esto requiere muy poca sobrecarga en el extremo de descompresión para copiar.

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

Russell Borogove
fuente
3
A veces es así de simple, un problema percibido no es necesariamente un problema real. Incluso si realmente existiera la sobrecarga de descomprimir dos veces, desinflar sin comprimir es una operación realmente rápida, supongo que la sobrecarga solo sería medible.
aaaaaaaaaaaa
¿El final de la compresión tardaría mucho en darse cuenta de que el archivo no es compresible?
user253751
Relativamente sí. No sé qué heurística usan los compresores .zip típicos para elegir la codificación de un bloque, pero podría ser tan sencillo como probar todas las codificaciones y mantener el mejor resultado. Durante el desarrollo, si debe tener sus datos en un archivo .zip, probablemente querrá forzar todo para usar en storelugar de deflateahorrar tiempo, luego deflatetodo para las versiones de lanzamiento.
Russell Borogove
2

Parece que ya se han dado algunas respuestas muy buenas, pero pensé que daría una más:

What are the solutions to this double compression problem?

Solución: no hacer nada.

Justificación: No ha habido ningún problema: sí, está comprimiendo la información dos veces, pero ¿por qué está preocupado por esto? ¿El tamaño de los datos es demasiado grande? ¿La descompresión es demasiado lenta? ¿Es esto más o menos importante que las docenas de características que podría agregar, refinar, probar y / o depurar en este momento?

NPSF3000
fuente
Hacer algo dos veces innecesariamente es un problema en sí mismo. Al menos lo he percibido como tal. Pero, por supuesto, también tienes razón con tu sugerencia. Tanto la memoria como la velocidad de descompresión pueden ser un problema, aunque no en este caso, ya que no estoy escribiendo un juego comercial.
user1095108
Soy un desarrollador de juegos profesional, y puedo asegurarle que, a menos que haya problemas de rendimiento reales y documentados, no perderíamos ni un segundo preocupándonos por esto: se requieren muchas compras de $ 0,99 o impresiones de anuncios para pagar la información, 8 horas para 'rectificar' adecuadamente este problema. Hacer algo dos veces no es un problema, aunque podría ser ineficiente. Aunque en este caso no está haciendo lo mismo dos veces: tiene datos de imagen que se almacenan como PNG para la compresión y un montón de archivos que se archivan juntos.
NPSF3000
Es cierto, pero una vez que está hecho, está hecho para múltiples proyectos. Si reflexiona sobre el algoritmo DEFLATE, se ha mantenido igual desde los años ochenta. Sería un viejo abuelo, si programara entonces, pero, si conociera el algoritmo, podría, por ejemplo, implementarlo en la GPU y disfrutar de velocidades de descompresión súper rápidas en múltiples proyectos.
user1095108
¿Entonces pasas, 2 semanas, un mes implementando Deflate en GPU? Y luego te das cuenta de que estás a punto de desplegarte en la plataforma X que Y y rompe tu algoritmo a través de Z. Si quieres hacer juegos, ENFOCATE EN LA CREACIÓN DE JUEGOS, no te preocupes por cosas innecesarias como desinflar el rendimiento.
NPSF3000
Una vez que conozca un algoritmo (re) implementado, debería ser fácil. Un chasquido, no 2 semanas o un mes. Eso es lo que quería decir. Ha existido desde los años ochenta, puede que valga la pena invertir algo de tiempo.
user1095108
1

Si usa formatos especializados como PNG y OGG, no necesitará la compresión de ZIP.

PNG, OGG y otros formatos ya comprimidos no serán mucho más pequeños al comprimirlos nuevamente como ZIP. 100 MB de PNG comprimidos siguen siendo ~ 100 MB.

Las secuencias de comandos, los archivos de configuración y otros formatos basados ​​en texto se benefician enormemente de la compresión, sin embargo, generalmente son pequeños en comparación, no almacenan tanta información. Si su juego es de 100 MB, entonces los archivos de texto pueden tener 1 MB de todo el juego, incluso si puede hacerlos de 100 KB a través de la compresión, entonces solo ganó 900 KB, menos del 1%, apenas vale la pena el esfuerzo.

Es posible que incluso desee utilizar el sistema de archivos directamente en lugar de utilizar un sistema de archivos virtual basado en zip. Haría que la aplicación de parches fuera muy fácil: puede intercambiar cualquier archivo que haya modificado.

API-Bestia
fuente
2
A veces uno no tiene otra opción, en cuanto a si usar un .ziparchivo o no. Por ejemplo, en la plataforma Android, .apkes un .ziparchivo que puede contener recursos.
user1095108
3
Además, existen ventajas definitivas al usar un archivo comprimido , y los archivos ZIP proporcionan compresión y una estructura de archivo.
MrCranky
Sí, lo sé, solo digo que usar el sistema de archivos nativo también tiene ventajas. Soy un poco defensor de "Mantenlo simple".
API-Beast