¿De dónde provienen todos los bytes?

¡Gran pregunta Dion! La responderé, y no solo porque seas mi nuevo jefe, sino porque es una buena pregunta. (pero también porque eres mi nuevo jefe).

Sin embargo, quiero dejar algo claro aquí: en realidad no estamos comparando manzanas con manzanas, así que definamos algunas tecnologías primero.

Cómo funciona Mario

Así que hablemos de cómo funcionó el juego original de Super Mario, desde una perspectiva de activos.

La consola NES original solo fue diseñada para generar imágenes de 256 de ancho por 240 de alto; lo que significa que la imagen final que debía mostrarse en la pantalla tenía un tamaño de 180 kb.

Además de eso, la NES solo tenía 2kb de RAM. Un cartucho en sí podría contener entre 8k y 1 MB de datos del juego. Por lo tanto, no había forma de encajar todo el contenido del juego en la memoria principal. Básicamente, un subconjunto de los datos del cartucho de 1 MB debe cargarse en la RAM de 2 kb y usarse para representar la pantalla de 180 kb. ¿Cómo se logra eso?

SpriteSheets.

Las hojas de Sprite contienen pequeños mosaicos de gráficos que se reutilizan una y otra vez. Por ejemplo, a continuación se muestra una nueva versión de la hoja de sprites de super mario original:

Cada cuadrado pequeño de 16x16 píxeles representa un "mosaico" y los artistas los unen para crear los niveles reales. Los niveles en sí, simplemente se convirtieron en una matriz 2D gigante de índices en la hoja de sprites. (Hablo de esto con mucho más detalle en la Lección 3 de mi curso de Desarrollo de juegos HTML5 @ Udacity, o en mi libro Perspectivas de desarrollo de juegos HTML5). Agregue un poco de Run-Length-Encoding, o un LZ77 básico, y obtendrá un formato bastante compacto para niveles.

Entonces, con conceptos como hojas de mosaicos y hojas de sprites, podemos usar un pequeño conjunto de imágenes para crear grandes escenas y mundos. Generalmente, así es como funcionan la mayoría de los juegos. Incluso los juegos en 3D tendrán un conjunto de texturas comunes que se aplican varias veces y en lugares a lo largo del juego.

Ahora hablemos de la compresión de imágenes genérica.

Cómo se comprimen las imágenes

Aquí está la parte " no justa " de esta comparación. Los algoritmos genéricos de compresión de imágenes no tienen conocimiento de dominio sobre los píxeles dentro de ellos. JPG, PNG, WebP se han diseñado para fotos y no tanto para pantallas de juegos . El resultado es que para un bloque dado de 16x16 píxeles, estos algoritmos asumen que es único entre la imagen; Además de cierta cuantificación de color, no se agrega una lógica real para determinar si otro bloque de 16x16 podría ser un duplicado exacto del actual. Esto generalmente significa que hay un límite inferior sobre cómo se comprime un bloque de datos determinado.

Por ejemplo, JPG divide una imagen dada en bloques de 8x8 píxeles, convierte el espacio de color RGB en la versión YCbCr y luego aplica la transformación de coseno discreto en ellos. Solo después de este paso, aparece un codificador sin pérdidas y ver si puede hacer coincidir los grupos duplicados comunes usando DPCM o RLE.

Por lo tanto, el único lugar donde dos bloques pueden compactarse en 1 bloque es si su versión posterior a DCTd es idéntica y RLE puede hacer recomendaciones de pasos. Esto no sucede tan a menudo.

A pesar de sus otros defectos, PNG es mucho mejor en este sentido. La compresión PNG no tiene pérdidas (por lo que la calidad de la imagen es alta, pero los ahorros de compresión son bajos) y se basa en el códec DEFLATE, que combina LZSS con la compresión aritmética. El resultado es que las tiradas largas de píxeles similares pueden acabar reduciéndose a un tamaño mucho más pequeño. Es por eso que una imagen con un fondo muy uniforme siempre será más pequeña como PNG en lugar de JPG.

La imagen de abajo es un archivo PNG de 5.9kb, mientras que la imagen JPG es de 106kb

Manzanas contra Dragonfruit

Mi punto aquí es que es un poco injusto comparar el contenido del juego con una sola imagen en Internet.

Desde el lado del juego, comienzas con un pequeño conjunto de mosaicos reutilizables y los indexas para construir tu imagen más grande, podemos hacer esto, porque sabemos cómo se va a hacer el juego. Por otro lado, JPG / PNG / WebP solo intenta comprimir los datos que puede encontrar en bloques locales, sin ningún deseo real de hacer coincidir el contenido repetido. La compresión de imágenes está claramente en desventaja aquí, ya que no tienen conocimiento previo de su espacio de datos, realmente no pueden tener expectativas al respecto.

Quiero decir, considere The Demo Scene, que es muy importante en este tipo de cosas. Pueden meter 30 minutos de un disparador 3D completo en 64 kb porque entienden y saben mucho más sobre sus datos.

Simplemente demuestra que, con la cantidad adecuada de conocimiento previo sobre sus datos, puede hacer grandes cosas con la compresión.

Viendo hacia adelante.

Obviamente, hemos crecido desde las pantallas de 256x240 de los días de NES. El teléfono que llevo en el bolsillo tiene una pantalla de 1.920 x 1.080 píxeles con un tamaño de 5,2 ”, lo que le da una densidad de ~ 423 píxeles por pulgada. Para comparar eso en la misma cantidad de píxeles, son ~ 33 pantallas de super-mario, o más bien, 8 MB de datos de píxeles. No creo que a nadie le sorprenda que las resoluciones de pantalla estén aumentando, pero también viene con la necesidad de más datos .

Esto es algo en lo que he estado insistiendo durante un tiempo. Si bien obtenemos pantallas más grandes, los canales de contenido necesitan aumentar sus salidas de resolución para que aún se vean bien en nuestras configuraciones de mayor densidad (de lo contrario, obtenemos una imagen borrosa en la escala ...). Esto, por supuesto, hace que nuestros paquetes de videojuegos aumenten de tamaño, nuestras páginas web aumenten de tamaño e incluso nuestros videos de transmisión de YouTube aumenten de tamaño. Básicamente, estamos enviando más datos a dispositivos más pequeños simplemente debido a la resolución de la pantalla. Lo cual, para los próximos 2 mil millones de personas en los mercados emergentes, en conexiones 2G, es como la peor idea de la historia.

Pero yo divago. Esa es una publicación diferente.