¿Por qué parpadean muchos gráficos de juegos de NES mientras que los juegos de SNES no tienen ese problema?

La Unidad de procesamiento de imágenes (PPU) de NES tiene un límite de la cantidad de sprites que puede mostrar en cualquier línea de exploración. Ese límite es ocho.

Los sprites tienen ocho píxeles de ancho.

El PPU también tiene un límite de 64 sprites totales que pueden estar en su memoria interna de sprites en cualquier momento.

Los sprites son generalmente cosas en un juego que se mueven, en relación con un fondo estático. Los personajes del jugador, enemigos, plataformas móviles, etc. generalmente son sprites.

Como ejemplo, Mario tiene 16 píxeles de ancho. Entonces, el NES usa dos sprites alineados horizontalmente para mostrarlo (bueno, seis en total para todo su cuerpo).

Entonces, en cualquier marco de juego dado, se consumen dos de las ocho posibles ranuras de sprites en las líneas de escaneo que contienen verticalmente los sprites de Mario.

Eso deja seis sprites para cualquier otra cosa. Los enemigos también suelen tener 16 píxeles de ancho, por lo que tres enemigos en las mismas líneas de exploración que Mario usarán las habilidades de visualización de sprites de línea de exploración de la PPU.

Entonces, ¿qué sucede si una plataforma en movimiento se desplaza verticalmente a través de estas líneas de exploración? La PPU no puede mostrarlos. No le quedan espacios en sus tuberías de prioridad de píxeles para colocar más datos de sprites.

La mayoría de los juegos serían imposibles de jugar si ocurriera esta situación: la plataforma en movimiento desaparecería y el tiempo del jugador sufriría. Mario moriría.

Entonces, para evitar esto, los juegos barajan la baraja. Reorganizan los sprites.

¿Por qué esto ayuda?

Debido a que la PPU escanea a través de los 64 sprites que se mostrarán en busca de sprites en la línea de escaneo que está dibujando actualmente. Una vez que encuentra ocho, se detiene *. Entonces, al barajar el orden, el juego hace que diferentes sprites sean visibles o no para cualquier marco dado.

Resultados de parpadeo.

* hay un error en algunas PPU donde realmente no se detiene y comenzará a procesar metadatos de sprites como coordenadas Y. Dado que la coordenada Y de un sprite es lo que le dice a la PPU cuándo dibujarlo, pero el error solo ocurre cuando ya se han seleccionado ocho sprites en las colas de prioridad de píxeles, este error no causa anomalías visuales.

Los metadatos de sprite para un sprite son sus coordenadas X e Y, su número de mosaico y el control de paleta y giro horizontal. Se necesitan cuatro bytes por sprite. Una “página” 6502 de RAM es de 256 bytes. Así, 64 sprites encajan perfectamente en una sola página. Alguna periferia personalizada en el dado de la CPU (es un sintetizador de audio 6502 más un controlador DMA) proporciona transferencias DMA de esta página de 256 bytes desde la RAM a la PPU.

No conozco SNES, pero supongo que eliminaron la limitación de sprites por línea de exploración, por lo que no parpadea.

Hay un número de razones. Metroid parece tener la mayoría de ellos.

1: colores.

La paleta de colores NES es extremadamente limitada. El tramado puede ayudar, hasta cierto punto, pero no es perfecto. Entonces, en lugar de vacilar en el espacio, uno se tambalea en el tiempo: uno tiene un parpadeo de objetos entre 2 sprites monocromáticos de diferente color. Como pastillas de energía.

2: demasiados objetos en una línea.

El NES solo puede representar un número finito de sprites en una línea dada. Cuando demasiados sprites entran en una línea, todos comienzan a parpadear, pero solo en las líneas afectadas. De nuevo, Metroid demuestra esto perfectamente. Dentro de los primeros 10 minutos también, si eres bueno.