Comprender el diseño del sistema de video del Super Nintendo
(fabiensanglard.net)- El video del SNES fue un diseño ajustado a una pantalla de 256x224, una tasa de cuadros de 60.098Hz y períodos de blanking dentro de las limitaciones de las TV CRT y la señal NTSC de principios de los años 90
- Un CRT no usa una cuadrícula de píxeles: dibuja líneas de barrido con cañones de electrones, señales RGB y HSYNC/VSYNC; la diferencia entre progresivo y entrelazado también depende de la ubicación de las señales de sincronización
- Como el SNES no podía tener un oscilador de video separado, dividía el reloj maestro de 21.47727MHz para crear un dot clock de 5.3693175MHz, y con la combinación de 262 líneas y 341 dots llegaba a 60.098Hz, distinto del estándar NTSC de 59.94Hz
- El modo básico se compone de 224 líneas visibles y 38 líneas de VBLANK dentro de 262 líneas, más 256 dots visibles y 85 dots de HBLANK dentro de 341 dots, asegurando tiempo para que la PPU trabaje en el line buffer de sprites
- El SNES PAL ofrecía otro oscilador y un modo overscan de 240 líneas para el entorno de 50Hz y 312.5 líneas, pero como la mayoría de los juegos estaban hechos para 224 líneas, eran comunes las bandas negras y una ejecución 17% más lenta
En qué puntos las TV CRT limitaron el diseño
- El destino básico de salida de video del SNES eran las TV CRT estándar, y en esa época los televisores recibían transmisiones analógicas NTSC por antena o video externo por una entrada AUX
- La entrada auxiliar de un televisor común se componía de un conector amarillo de video compuesto y conectores blanco y rojo de audio estéreo
- Un CRT puede verse como un dispositivo de dibujo de líneas de clase 15kHz, capaz de dibujar unas 15,000 líneas por segundo
Un CRT funciona con líneas de barrido y señales, no con píxeles
- Dentro de un CRT hay tres cañones de electrones, y los electrones son desviados hacia arriba/abajo y hacia izquierda/derecha mediante imanes verticales y horizontales
- Los electrones en sí no tienen color; una máscara hace que los electrones de cada cañón lleguen a la tira de fósforo del color correcto
- Un CRT no tiene píxeles, y las ranuras tampoco son píxeles
- Un televisor de alta resolución tiene ranuras más pequeñas, por lo que puede representar con mayor fidelidad la misma señal de color en dirección horizontal
- Un CRT recibe cinco señales por cuatro cables
- Las señales Red, Green y Blue están conectadas directamente a cada cañón de electrones
- Si no hay señal en los tres cables RGB, no se disparan electrones y se muestra negro
- El cable blanco es Composite Sync(CSYNC), que transporta HSYNC y VSYNC juntos
- El CRT no genera VSYNC; recibe la señal de sincronización enviada por el sistema externo para alinear la posición del cañón de electrones
Diferencia entre progresivo y entrelazado
- Un CRT dibuja una línea de izquierda a derecha y, al recibir HSYNC, vuelve al lado izquierdo de la pantalla, X=0
- Al recibir VSYNC, regresa a la parte superior de la pantalla, Y=0
- Mientras el cañón de electrones se mueve hacia la derecha, sigue una trayectoria inclinada hacia abajo, y la siguiente línea después de HSYNC se dibuja debajo de la línea anterior
- Si VSYNC ocurre al mismo tiempo que el último HSYNC, se convierte en un barrido progresivo, en el que el campo se dibuja en la misma posición
- Si VSYNC ocurre entre dos HSYNC, las líneas del siguiente campo se insertan entre las del campo anterior, lo que produce entrelazado
- El entrelazado duplica la resolución vertical, pero la tasa de actualización de cada línea cae a la mitad
- NTSC emite dos campos a unos 30Hz, por lo que el CRT reservaba el espaciado entre líneas para el entrelazado; al dibujar en progresivo se ve la separación negra de las scanlines
Especificación NTSC y límites de un diseño simple
- El diseño del SNES debía acercarse a valores que un televisor NTSC pudiera procesar
- Relación de aspecto: 4:3
- Número de líneas por campo: 262.5
- Número de dots por línea: 341.25
- Frecuencia de campo: 59.94Hz
- NTSC en blanco y negro originalmente era de 60Hz, pero NTSC color redujo la frecuencia 0.1% para evitar artefactos durante el proceso de agregar color manteniendo la compatibilidad hacia atrás
- De forma simple, se podría elegir progresivo de 262 líneas, 350 dots y 59.94Hz, lo que exigiría un dot clock de 5,496,498Hz
- Pero este diseño no encajaba con el SNES real
- Por restricciones de costo no se podía incluir un oscilador dedicado para el sistema de video, y los subsistemas debían usar el oscilador maestro dividido
- Como el cañón de electrones de un CRT puede seguir disparando incluso durante el retorno de la imagen, se necesitan overscan y manejo de blanking
Blanking y elección de la resolución vertical
- Si el cañón de electrones sigue disparando cuando su posición se reinicia horizontal o verticalmente, aparecen artefactos visibles
- Los televisores hacen overscan, mostrando una imagen un poco más grande que la pantalla, y la cantidad varía según el televisor
- Después de VSYNC y HSYNC, la posición del cañón de electrones vibra por un momento, por lo que se necesita un tiempo en el que se detenga el disparo de electrones hasta obtener líneas rectas estables
- El período de apagado del disparo de electrones después de VSYNC es VBLANK
- El período de apagado del disparo de electrones después de HSYNC es HBLANK
- Los sistemas competidores de la época también usaban blanking
- Capcom CPS-1: 262 líneas, VBLANK 38 líneas, 224 líneas visibles, 59.6294fps
- Sega Genesis: 262 líneas, VBLANK 38 líneas, 224 líneas visibles, 59.9227fps
- Neo-Geo AES: 264 líneas, VBLANK 40 líneas, 224 líneas visibles, 59.18fps
- El SNES divide 262 líneas en 224 líneas visibles + 38 líneas en blanco
- 224 es divisible entre 16, por lo que encaja bien con una pipeline gráfica basada en tiles de 16x16
Resolución horizontal y 60.098Hz
- El SNES divide el reloj maestro de 21.47727MHz entre 4 y usa un dot clock de 5.3693175MHz
- La tasa de cuadros, el número de líneas, los dots por línea y el dot clock están conectados entre sí
- Al poner una tasa de cuadros objetivo de 59.94Hz y 262 líneas, se obtienen unos 342 dots por línea, pero por los artefactos de portadora de la salida compuesta los ingenieros de Nintendo debían usar 341 dots
- Con esta combinación, la tasa de cuadros del SNES es 5.3693175MHz / (341 * 262) = 60.098Hz
- 60.098Hz difiere de los 59.94Hz de NTSC, pero funciona dentro del rango tolerado por los CRT
Por qué la pantalla básica quedó en 256x224
- No se puede usar toda una línea de 341 dots como área visible; se necesita HBLANK para ocultar vibraciones, artefactos y el overscan del televisor
- Para 224 líneas, un ancho visible cercano a 4:3 es 224 * 4/3 = 298 dots
- Como la pipeline de tilemaps usa tiles de 16x16, los valores posibles son 304, 288, 272, 256, 240, etc.
- 304 dots es un valor cercano a uno con casi ninguna distorsión de pantalla
- También existía la restricción de que la PPU debía llenar el line buffer de sprites durante HBLANK
- Si se elegían 304 dots visibles, HBLANK quedaba en 37 dots, unos 7µs
- Es probable que hiciera falta más tiempo para traer los datos de hasta 128 sprites
- La elección final fue 256 dots visibles + 85 dots de HBLANK
- La PPU obtiene unos 16µs durante HBLANK
- La relación de aspecto del área visible no es 4:3 sino 8:7, por lo que al mostrarse en un CRT se produce una ligera distorsión
Compromisos del modo de alta resolución
- La configuración básica de video del SNES es resolución overscan de 341x262, resolución visible de 256x224 y tasa de cuadros de 60.098Hz
- El 99% de los juegos usó esta configuración, pero el SNES también tiene modos de alta resolución que duplican la resolución vertical u horizontal
- Para una resolución vertical de 448 líneas, basta con emitir VSYNC medio renglón después del último HSYNC para crear un cuadro entrelazado
- En ese caso, cada línea se actualiza a 60.098/2 = 30.049Hz
- Aparece parpadeo y no se ve bien, pero aumenta la resolución vertical
- Duplicar la resolución horizontal es más difícil porque no existe el dot clock necesario
- El SNES desplaza ligeramente el segundo campo en horizontal para que los puntos caigan entre los puntos del campo anterior
- El resultado es media tasa de cuadros y una gran mezcla de color
- fullsnes.txt resume ejemplos de uso de alta resolución en varios títulos
- Logo de Nintendo en Donkey Kong Country 1: 512x224, BgMode5
- Pantalla de configuración de Seiken Densetsu 2: 512x224, BgMode5
- RPM Racing: intro y juego en 512x448, BgMode5+Interlace
- El caso de Ranma 1/2 en realidad es 256x224, pero el entrelazado quedó activado por accidente y genera parpadeo innecesario
PAL, SECAM y los problemas del SNES europeo
- Los televisores europeos no usan NTSC sino PAL, y Francia también usaba SECAM
- El entorno PAL espera exactamente 50Hz y 312.5 líneas por campo
- El SNES PAL incorpora un oscilador de 17.7344750MHz en lugar del de 21.4772700MHz de NTSC
- El chip S-CLK aplica un procesamiento de 6/5 y luego vuelve a dividir por 4 para crear un dot clock de 5.32034250MHz
- Si solo se usan gráficos de 224 líneas, aparecen grandes bandas negras arriba y abajo del área visible
- Para reducirlas existía un modo overscan que aumentaba las líneas visibles a 240
- Las 16 líneas adicionales equivalen a la altura de un tile
- En la práctica, la mayoría de los títulos se crearon para 224 líneas, así que casi no usaron este modo
- Solo lo usaron 12 títulos en total
- Super Mario World respondió ampliando el rango de visión vertical en PAL
- Como tanto NTSC como PAL usan relación de aspecto 4:3, la imagen PAL queda un poco más comprimida verticalmente que la NTSC
- Mucho código de juegos no reflejaba que VSYNC ocurriera a 50.00697891Hz en vez de 60.098Hz, y como resultado los juegos se ejecutaban 17% más lento de lo previsto
Señales de salida y conector AV
- Las señales RGB y de sincronización vistas antes son señales puras que manejan directamente un CRT, pero en la práctica la mayoría de los televisores no permitía introducir señales directamente al CRT
- Muchos televisores solo tenían una entrada compuesta amarilla en la parte trasera, y algunos modelos de gama alta ofrecían entrada S-Video
- El SNES convierte las señales para CRT tanto a compuesto como a S-Video
- El conector AV no descarta señales y ofrece varias formas de salida
- Red, Green, Blue
- C-Sync
- S-Video basado en Luminance y Chrominance
- Composite Video
- +5V DC
- Ground
- Left Audio, Right Audio
- Los televisores europeos, especialmente los franceses, a menudo tenían conector SCART, y este método permitía fabricar cables que inyectaban la señal de forma más directa al CRT
- Como resultado, los usuarios europeos podían disfrutar juegos 17% más lentos y con bandas negras, pero con una alta fidelidad de imagen
1 comentarios
Comentarios de Hacker News
Es muy probable que 224 no sea un número elegido al azar. Es divisible por 16 (224/16=14), así que encaja bien con los tilemaps del pipeline de renderizado gráfico.
Cuando era chico y trasteaba con varias cosas para aprender programación de juegos, recién lo entendí mucho después, y en ese momento todo me cerró. En CGA/EGA/VGA eran comunes los modos de 320x200, y NES y SNES tenían 256x224, lo que en la práctica estaba bastante cerca de ser una restricción de la TV.
En cambio, el Pac-Man arcade era 288x224, así que los clones de Pac-Man para PC nunca se veían “bien”, e incluso la versión de Pac-Man para NES hecha por Namco tampoco encajaba. Los tiles del mapa se achicaban y los personajes quedaban gigantes, o se convertía en un mundo con desplazamiento como en las versiones de Game Boy/Tengen, o aparecían compromisos como distorsión o mapas no originales; por eso, cuando uno intentaba jugar un juego “arcade” en casa, se sentía raro y frustrante.
Después de aprender la estructura de las máquinas y cómo funcionaban los sprites, llegué a la conclusión de que, al final, no había otra opción, y fue una gran revelación. Si además se considera que en esa resolución de PC los píxeles no eran cuadrados, la cosa se vuelve todavía más compleja.
Desde entonces, cada vez que veo un port o clon de Pac-Man, enseguida me pongo a revisar el tamaño del mundo, el tamaño de los tiles y el tamaño de los sprites.
Sin embargo, ese overscan variaba según el televisor, y las TV modernas o los emuladores normalmente muestran las 240 líneas completas.
La resolución vertical de la SNES podía configurarse en 224 o 240 líneas, como dice el artículo. La mayoría de los juegos usaba 224 líneas porque eso alargaba el tiempo de blanking vertical y daba más tiempo para transferir gráficos a la PPU.
También vale la pena leer el artículo de Rodrigo Copetti sobre la arquitectura de la SNES: https://www.copetti.org/writings/consoles/super-nintendo/
Es cierto que 59.94Hz es un número raro, pero hasta donde sé no existe una red eléctrica de 30Hz. Norteamérica y algunas regiones donde se diseñó NTSC usan una red eléctrica de 60Hz.
https://en.wikipedia.org/wiki/Mains_electricity_by_country
La frecuencia más alta generada en un televisor en blanco y negro era la frecuencia de barrido horizontal, que era un múltiplo de la tasa de cuadros. Al agregarse la señal de color NTSC con una portadora de 3.579545MHz, la frecuencia máxima dentro del televisor se volvió mucho más alta, y para mantener el hardware simple, las frecuencias más bajas siguieron ajustándose como divisores de esa frecuencia máxima, es decir, de la portadora de color. Como resultado, la tasa de cuadros pasó a ser de 59.94 campos por segundo.
Me pegó mucho la parte de que, en regiones PAL, los juegos no se ajustaban al VSYNC de 50.00697891 Hz y por eso corrían un 17% más lento que la referencia de 60.098 Hz.
No es algo exclusivo de Super Nintendo, pero me hizo acordar a la primera vez que vi o jugué Sonic the Hedgehog en Mega Drive (Genesis). Se sentía más torpe y lento que la versión de Master System, así que no me impresionó mucho; recién después de que apareció YouTube entendí que la diferencia de velocidad entre NTSC y PAL era enorme. No solo la velocidad del juego: la música también suena espantosa en PAL.
Incluso en la era de los 16 bits sabía de PAL y de la necesidad de la “caja negra”, pero no sabía que la diferencia fuera de ese tamaño. Creo que las revistas de consolas de la época decían que, en la mayoría de los juegos, la diferencia era pequeña; una excepción era DooM para SNES, donde la versión NTSC tenía una pantalla más grande.
De niño era bueno en Punch-Out de NES y podía vencer a Mr. Dream o Mike Tyson en el primer round, pero ahora que lo pienso, estaba jugando la versión PAL. Si hubiera ido a un torneo en Estados Unidos, me habrían destrozado en el primer round y seguramente habría quedado convencido de que alguien me tendió una trampa.
Por ejemplo, con una menor tasa de cuadros, Samus y los proyectiles se mueven más píxeles por cuadro, lo que hace más fácil atravesar objetos; por eso este glitch de la puerta solo es posible en PAL: https://www.youtube.com/watch?v=RvyIwtO_qgM
Las constantes físicas de Samus y sus tiempos de animación se ajustaron a la nueva tasa de cuadros, pero los enemigos, las cinemáticas y otros elementos del entorno no. Por eso, en PAL, Samus se mueve a la misma velocidad que en NTSC, pero el resto del mundo se mueve más lento. Gracias a eso, se pueden recoger las Bombs y salir de la sala justo antes de que la puerta se bloquee, saltándose al minijefe: https://www.youtube.com/watch?v=R3t8TIIj7IM
En la versión NTSC, el mismo salto requiere una preparación compleja y decenas de inputs consecutivos con precisión de cuadro; hasta ahora solo una persona lo ha logrado: https://www.youtube.com/watch?v=jcKUMk5g8Wk
También hay una comparación de los speedruns asistidos por herramientas más cortos en NTSC (izquierda) y PAL (derecha): https://www.youtube.com/watch?v=KD_-thqcB5s Ambos runs usan casi la misma ruta hasta casi el final, y la versión NTSC es más rápida en casi todas las salas, pero la preparación para la ejecución de código arbitrario es completamente distinta, así que PAL termina antes al final. El run de NTSC tiene que hacer una secuencia muy lenta de pausa/reanudación para atravesar una puerta sin activarla, salir de los límites y provocar corrupción de memoria. En cambio, la versión PAL puede lograr ejecución de código arbitrario completamente dentro de la pantalla aprovechando una condición de carrera del sistema de animaciones del juego. Es una carrera entre el temporizador de retroceso de los pinchos y la animación de aterrizaje de Samus; solo los tiempos de Samus se corrigieron para PAL y los de los pinchos no, así que en PAL aparece un timing explotable solo en ese contexto.
Con la llegada de Dreamcast aparecieron por primera vez juegos que permitían cambiar entre 50 Hz y 60 Hz, siempre que el televisor lo soportara. Además, en los juegos que no reflejaban bien esa diferencia, podías volver a 50 Hz para hacerlos más fáciles; recuerdo que Crazy Taxi era mucho más fácil a 50 Hz.
Se siente raro que se vendieran juegos tan distintos tal cual, pero entiendo perfectamente por qué se tomó esa decisión. De niño daba por hecho que Mario era Mario en todas partes y Sonic también era Sonic en todas partes.
Me pregunto si estas diferencias terminaron en la época de las consolas 3D. A partir de entonces, el renderizado y la lógica del juego, en su mayoría, ya no estaban completamente acoplados.
Parece que hay un error tipográfico en el original. Dice que la relación de aspecto es 8:6, pero eso es lo mismo que 4:3; según el cálculo, lo correcto es 8:7.
Creo que falta la parte en que 256x224, es decir, la resolución de salida 8:7, se estira hasta aproximadamente 4:3, más precisamente una imagen de 64:49.
La velocidad de puntos de la SNES es de unos 5.37 MHz, más lenta que la velocidad de píxeles cuadrados de unos 6.13 MHz definida por el estándar ATSC. Es exactamente 8/7 más lenta, por lo que los píxeles se estiran horizontalmente 8/7; así, la resolución 8:7 se estira a (8/7)(8/7)=64/49, cerca de 64:48=4:3.
El cálculo de que “para tener una relación de aspecto cercana a 4:3 se necesitan 224(4/3)=298 puntos visibles” pasa a tener un factor de (4/3)/(8/7)=7/6 si se considera lo anterior. Entonces se necesitan 224*(7/6)=261.33... puntos visibles, mucho más cerca de los 256 que se eligieron realmente.
Yo usaba la salida RF con una caja conmutadora para alternar entre la SNES y la antena del televisor.
Más tarde, cuando me convertí en ingeniero de video, pude reírme de eso, pero me alegra que mi yo de niño no supiera lo espantosa que era realmente esa calidad de imagen.
La relación de aspecto 8:7 del artwork también se ve en ports de otras plataformas de SFC/SNES, como ROCKMANX3 / Mega Man X3
Las versiones para PSX/Saturn/PC mantuvieron el arte original sin estirarlo; en cambio, para ajustar 8:7 a 4:3 agregaron márgenes verticales adaptados a cada escenario. Si estás acostumbrado a la versión original, al jugar resulta bastante molesto, y en las capturas de pantalla de la versión de Saturn se puede ver que todo se ve apenas demasiado delgado: https://segaretro.org/Mega_Man_X3
Me da curiosidad cuánto tarda Fabien en escribir artículos como este. Tienen muchísimos detalles y están muy bien organizados
Me da curiosidad qué tanta parte de las resoluciones de SNES estaba fija en el hardware de la consola y qué tanto era un ámbito que podía manejar el cartucho
Por ejemplo, si un cartucho tuviera su propio coprocesador, no necesitara cargar sprites y además tuviera un reloj integrado, ¿en teoría podría generar más de 256 píxeles horizontales por línea?
Con un coprocesador, podría renderizar un frame por su cuenta y colocarlo en la ubicación de memoria desde donde se leerán los tiles de la siguiente línea. Creo que SuperFX hacía algo más o menos así
Pero al final, quien realmente dibuja los píxeles y maneja la cantidad de colores, etc., es la PPU, así que en última instancia queda limitado por las restricciones de la PPU