Hilo técnico de consolas 2D

Como nos han echado del hilo de la Super Nintendo (y hacen bien, creo [+risas]), abro este hilo para hablar de temas técnicos de consolas 2D (y arcades si hacen falta) y hacer las comparativas entre sistemas que hagan falta sin que nadie se ofenda ni acuse de off-topic XD

Empiezo el hilo a partir de este post de @M68K y las respuestas de @Señor Ventura. En la segunda se afirma que en juegos como el Super Pang, el Smash TV, el Super Goal 2, el Nigel Mansell F1 y en los bullet hell la SNES tiene una "ventaja potencial" en el uso de sprites. Veamos que eso no es cierto:

Como se comentaba en este post, la SNES y la Mega Drive tienen dos límites que impiden mostrar sprites "infinitos" en una scanline de la pantalla: el número de sprites máximo y y el número de tiles de sprites máximo:

Mega Drive (H40) -- 20 sprites - 40 tiles de sprites
Super Nintendo ----- 32 sprites - 34 tiles de sprites

Hay gente que cree que la SNES es mejor que la MD en este punto porque la diferencia en el primer límite es mucho mayor que en el segundo. Esto sería cierto si la mayoría de sprites en un juego fueran del menor tamaño posible (8x8), pero en la práctica en casi todos los juegos la mayoría de sprites son de mayor tamaño. Veamos el límite de sprites por scanline en cada consola dependiendo del tamaño de los sprites:

-------------------------- 8x8 - 16x16 - 32x32
Mega Drive (H40) -- 20 -- 20 ------ 10
Super Nintendo ----- 32 -- 17 ------ 8

En la tabla se ve que en cuanto todos o casi todos los sprites sean de 16x16 o mayores, la Mega Drive es mejor que la SNES en este sentido. Veamos los juegos que ha mencionado @Señor Ventura como ejemplos de "ventaja potencial" en el uso de sprites:

Smash TV

Imagen

Todos los sprites son de 16x16 o de 32x32, así que los parpadeos de sprites salen antes en la SNES que en la Mega Drive.

Super Goal 2

Imagen

Todos los jugadores son de 16x16, así que los parpadeos de sprites salen antes en la SNES que en la Mega Drive.

Super Pang

Imagen

Todos los sprites menos los de las bolas pequeñas (jugador, disparos, objetos, bolas grandes) son de 16x16, así que los parpadeos de sprites salen antes en la SNES que en la Mega Drive menos cuando coges una bomba y todas las bolas se hacen pequeñas y no hay más objetos en pantalla. Solo en ese caso gana la SNES XD

Nigel Mansell F1

Imagen

Este juego diría que mezcla sprites de 8x8 y de 16x16 con la misma proporción, así que dependiendo de la mezcla del momento gana la SNES o la Mega Drive. De todas formas es un juego que no muestra muchos sprites en pantalla, no me parece un buen ejemplo de este tema.

Bullet hells

Que yo sepa no hay juegos comerciales de este género en la SNES. Lo más parecido que hay es el Rex Nobilis, que aún no ha salido del horno (y lo que le queda, creo [+risas]). Kulor ha comentado alguna vez que él no usa sprites de 8x8 por motivos de rendimiento, por lo que en su juego los parpadeos de sprites salen antes en la SNES que en la Mega Drive.

Como conclusión, para que la SNES gane a la Mega Drive en este género o en cualquier otro, la mayoría de sprites deben ser de 8x8. En la mayoría de ocasiones no es así, ya que suele haber suficientes objetos como el protagonista, los enemigos, items a recoger, etc que cambian la distribución a favor de la Mega Drive.

Pongo un ejemplo de juego para la GBA en el que la SNES sería mejor que la Mega Drive si fuera capaz de moverlo XD

Qué pereza, ¿no podéis jugar a lo que os gusta y ya está?
La gente ya no se conforma con tener razón, además tienen que hacer que todos lo vean…
Respondo aquí para no hacer off-topic en el hilo de la SNES:

Señor Ventura escribió:Cirote, eres programador, sabes perfectamente, y mejor que nadie, que cualquier uso del hdma no consume recursos de cpu.

@Señor Ventura como he usado alguna vez el HDMA, sé bastante bien (pero no mejor que nadie XD) que cualquier uso del HDMA bloquea la CPU mientras está activo y que preparar las tablas de datos y activar y desactivar el HDMA cuando toca también se llevan su pellizco de CPU, así que claro que consume recursos de CPU. Ya he hablado de ello alguna vez.

Señor Ventura escribió:Super pang usando el modo 0 no tiene nada de ridículo (menos colores, mas planos, ya lo sabemos, si).

Yo creo que usar tiles de 4 colores quedaría como el puto culo. ¿Puedes mostrar cómo quedaría cualquier fondo del Super Pang con tiles de 4 colores?


stormlord escribió:Qué pereza, ¿no podéis jugar a lo que os gusta y ya está?

EOL está lleno de hilos que me dan pereza leerlos y no voy llorando por cada uno de ellos XD
cirote3 escribió:EOL está lleno de hilos que me dan pereza leerlos y no voy llorando por cada uno de ellos XD

:-?
@cirote3 sabes si hay algún tipo de truco del almendruco para superar los limites de sprites o engañar y aparentar que los supera? Tanto para MD como para SNES digo.
SuperPadLand escribió:@cirote3 sabes si hay algún tipo de truco del almendruco para superar los limites de sprites o engañar y aparentar que los supera? Tanto para MD como para SNES digo.

Para superar los límites de sprites por scanline no hay truco que valga, pero el truco del almendruco para aumentar el número de sprites en pantalla es multiplexar sprites. El supercrack del Shannon Birt lo usa para mostrar casi 150 sprites en pantalla en el Parodius de la Mega Drive:



Yo en el Cirote 3 a veces muestro más de 1000 sprites en pantalla gracias a eso, pero en la GBA tiene menos mérito :(

Tanto la Mega Drive como la GBA pueden multiplexar sprites sin problemas, pero otras consolas como la SNES y creo que la PC Engine no pueden.
Si no se puede contestar a nivel técnico en el hilo de SNES para mostrar su funcionamiento y hacer ciertas comparativas mínimas para conocer los puntos fuertes/débiles de cada sistema, espero que en este hilo pueda hacerlo .

No te lo tomes como un ataque el que ahora te vaya a quotear, Ventura. Veo demasiado absolutismo quizás en varios puntos de tu comentario y otros puntos que sobre el papel parecen prometedores pero donde hay bastante más:

Señor Ventura escribió:Super pang con escenarios a 512x224 y una cantidad de bolas que amenaza con superar los 30 fragmentos por linea horizontalmente una vez iniciada su destrucción, parece casi diseñado para encajar especificamente en el hardware de la snes, porque además cualquier tamaño de bola requiere únicamente sprites cuadrados. Efectivamente, el cuanto se haya currado capcom el actual port no desmiente la capacidad del hardware.

Los escenarios de Super Pang de SNES no funcionan a 512x224 (pseudo Hi-res en Modo 1). Esta creencia viene dada por el flag activo de High Resolution Mode que se dejaron en la ROM
Imagen
El registro $2133.3 está habilitado, pero eso no implica automáticamente que el juego esté emitiendo una señal de vídeo de 512×224.

Para comprender lo que sucede, podemos examinar el Visor de eventos de Mesen. Allí podemos verificar que, en la línea de exploración 225, el registro $2105 se establece en $09, configurando el Modo 1 estándar para todo el fotograma. No se realizan más escrituras en este registro durante la renderización, lo que nos permite descartar cualquier cambio dinámico de modo gráfico mientras se dibuja la pantalla.
Imagen

En el mismo visor, así como en el visor de mapas de mosaicos, podemos ver que las capas 1 y 2 simplemente se superponen. No se combinan ni se utilizan para generar nuevos colores. Los registros de Matemáticas de Color ($2130 y $2131) permanecen en $00, lo que significa que esta funcionalidad no se está utilizando.
Imagen

Además, los registros $212C y $212D muestran la misma configuración simultáneamente para la capa de pantalla principal (MSL) y la capa de subpantalla (SSL), con todas las capas habilitadas excepto BG4. Esto indica que tampoco se utilizan para aumentar la resolución, sino simplemente para superponer capas.
Imagen

Para que el modo Pseudo Alta Resolución controlado por el registro $2133 proporcione una resolución horizontal real de 512 píxeles, la Pantalla Principal y la Pantalla Secundaria deben enviar información diferente a la PPU para que esta pueda intercalarlas píxel a píxel. Si quisiéramos que el Modo 1 se comportara como un modo de pseudo alta resolución, la Capa de Pantalla Principal y la Capa de Pantalla Secundaria necesitarían configuraciones diferentes:

Main: ACEGI

sub: BDFHJ

Pero lo que realmente tenemos es:

Main: AAAAA

Sub: AAAAA

Lo que significa que no se obtiene ni se amplía información adicional. Además, la posible ganancia de resolución sólo se ve afectada por el fondo. Los sprites siguen moviéndose sobre su propia capa de 256x224, tampoco obtienen ganancias de desplazamiento efectivo de área. Aquí sólo se ganaría detalle visual de fondo, aumentando el contraste para con los sprites en calidad de nitidez, cosa que se puede percibir rara por la diferencias de resoluciones de las diferentes capas.
Imagen

Señor Ventura escribió:una cantidad de bolas que amenaza con superar los 30 fragmentos por linea horizontalmente una vez iniciada su destrucción

En el Super Pang de arcade no hay ningún momento en el que se lleguen alineare 30 objetos en una misma línea. Este es el punto donde verás el máximo de objetos alineados en una misma línea, y porque el mapa está diseñado para ello:
Imagen

Parece que ocupe toda la pantalla pero "sólo" hay 20 bolas. En un sistema como MD donde la limitación se mantiene en 20 sprites por línea, aún poniendo 20 bolitas en este escenario concreto y, sabiendo de antemano con qué inercia y velocidad van, se puede agrupar 2 bolas en sprites de 16x8 teniendo cada uno de los tiles internos de ese sprite su propio hitbox en el que si una de estas bolas impacta, genera un sprite de 8x8 con una sóla bola a cambio.

El hecho de que puedas pensar que se puedan alinear 30 objetos en Super Pang es porque nos tragamos el principio de proximidad, el principio de semejanza y el principio de continuidad del effecto GESTALT

De hecho, añado aquí un gameplay en el arcade de Super Pang para quien quiera que indique en qué momento se alinean 20 bolas en la misma línea lejos del ejemplo que he puesto:
https://youtu.be/cOKZ7RcsjlQ?si=nGejBJBECJ9TTkqy

Señor Ventura escribió:Para empezar, todo juego de disparos encaja directamente mejor en la arquitectura de snes

En el hilo de FF2, concluías que la selección de tamaños de sprites de 16x16 y 32x32 no era algo tan eficiente como el uso de 8x8 y 32x32 basándote en puntuales momentos de "derroche" cuando usaba sprites de 16x16 para pintar 3 píxeles concluyendo que no estaba optimizado.

Aquí haces justo lo contrario: Justificas un punto concreto beneficioso para esta configuración para afirmar que el diseño global de un juego de disparos encaja mejor en SNES que en cualquier otro sistema.

Claro, tú pones en un papel al personaje al borde disparando una serie de proyectiles de izquierda a derecha y los 32 sprites por línea máximos, encajan.

Pero existen técnicas como las comentadas de Super Pang donde puedes añadir sprites horizontales donde cada tile dentro de ellos pudiera llevar su propio hitbox y que actuasen como objetos individuales:
Imagen
Bastaría con cambiar cada tile interior de estos sprites de 32x8 las líneas que representan el Laser (−) por bolitas que encajen en tiles de 8x8 (◉).
*Como curiosidad, la imagen que he puesto se forma usando 21 sprites totales sin la necesidad de querer cubrir la línea a base del uso de 32 sprites de 8x8. La flexibilidad y eficiencia de diferentes tamaños de sprites simultáneos no es ninguna invención, sino una realidad objetiva.

Luego también sería posible realizar el clásico truco del parpadeo sincronizado para los proyectiles en caso de temer superar el máximo de sprites por línea:
Imagen

O incluso combinar varios efectos como el parpadeo sincronizado y la búsqueda del desvío vertical de un "rayo" realizando "S" horizontalmente para evitar ese limitante concreto que mencionas:
Imagen

Además de lo descrito, el uso de sobremanera de los 32 sprites por línea se dan en casos puntuales (en elq ue estás a un lado de la pantalla) y está bien tenerlo en cuenta, pero en un Run&Gun un personaje se mueve y desplaza el scroll mientras este está, generalmente en el centro de la pantalla. Un juego de disparos no sólo se compone tampoco de sprites de 8x8 en todos los aspectos, de hecho, hacerlo así hace que quemes demasiadas entradas OAM y recordemos que el máximo que puede dibujar 128 sprites de 8x8, que viene a ser poco más del 14% del total de la pantalla.

¿El límite de 32 sprites por línea sirve para evitar en la medida de lo posible el flickering cuando se dispara horizontalmente? Por supuesto.
¿Es más fácil a nivel de programación usar estos sprites de 8x8 para un juego de disparos y no tener que aplicar técnicas con variables para ahorrar tiempo de desarrollo y comerte menos la cabeza? Claro que sí.
¿Esto es un indicativo en el que podamos concluir que la arquitectura de la máquina fue diseñada para juegos de disparos? Ni mucho menos.

Es una capacidad a la que se le puede sacar provecho en diversas situaciones. Pero como dije antes, una ventaja concreta no convierte a un sistema en algo inherentemente más eficiente en un género sin ver ni estudiar todos los matices que el propio género demanda.
M68K escribió:¿Es más fácil a nivel de programación usar estos sprites de 8x8 para un juego de disparos y no tener que aplicar técnicas con variables para ahorrar tiempo de desarrollo y comerte menos la cabeza? Claro que sí.

Yo en eso no estoy de acuerdo, o no siempre. Cuanto más pequeños sean los sprites, más sprites tienes que usar para mostrar un personaje, con el dolor de huevos que implica tener que evitar que distintas partes de un personaje tengan distinta prioridad. Si cada personaje usa solo un sprite, no hay problemas de prioridad y evitas que por ejemplo las piernas de un enemigo salgan por encima de otro pero el resto del cuerpo no.

Además, cuanto más pequeños sean los sprites, más CPU se consume: si muestras un personaje de 16x16 con sprites de 8x8, el consumo de CPU aumenta 4 veces. Si haces lo mismo con un personaje de 32x32, el consumo de CPU aumenta 16 veces, etc. Si encima tienes que corregir prioridades entre ellos, el consumo de CPU se dispara.

Por ese par de temas creo que la forma de comerte menos la cabeza y ahorrar CPU es usar sprites más grandes y evitar mostrar personajes con varios sprites en la medida de lo posible. Esos son los motivos por los que Kulor no utiliza sprites de 8x8 en el Rex Nobilis, y creo que son los mismos motivos por los que Till & Hat tampoco usa sprites de 8x8:

Imagen
@cirote3 Muy cierto. Yo me refería en cuanto a proyectiles, que al menos para mí, me resultaría más fácil hacer eso de "que cada proyectil salga en un sprite 8x8 con su hitbox y pa´lante" que tener que meter una variable como "si el prota está en el suelo que realice sprites de 32x8 según cadencia y si está en el aire (cayendo o saltando) sean sprites de 8x8". CReo que no me expresé demasiado bien jaja.

Además, cuanto más pequeños sean los sprites, más CPU se consume

Esto es muy cierto pero que no mucha gente suele tenerlo en cuenta. Y aún así, hay juegos como RR2 que lo llevan muy bien en cuanto a rendimiento, pero es innegable que es un handicap.

PD: No había visto Till&Hat internamente, creo que entiendo mejor por qué en la sección del helicóptero se ve bastante flickering: No hay diferentes alturas y todo es a base de sprites de 16x16 y 32x32.
M68K escribió:@cirote3 Muy cierto. Yo me refería en cuanto a proyectiles, que al menos para mí, me resultaría más fácil hacer eso de "que cada proyectil salga en un sprite 8x8 con su hitbox y pa´lante" que tener que meter una variable como "si el prota está en el suelo que realice sprites de 32x8 según cadencia y si está en el aire (cayendo o saltando) sean sprites de 8x8". CReo que no me expresé demasiado bien jaja.

Además, cuanto más pequeños sean los sprites, más CPU se consume

Esto es muy cierto pero que no mucha gente suele tenerlo en cuenta. Y aún así, hay juegos como RR2 que lo llevan muy bien en cuanto a rendimiento, pero es innegable que es un handicap.

PD: No había visto Till&Hat internamente, creo que entiendo mejor por qué en la sección del helicóptero se ve bastante flickering: No hay diferentes alturas y todo es a base de sprites de 16x16 y 32x32.

En la SNES hay que hacer balance entre meter más parpadeos con sprites grandes o meter más ralentizaciones con sprites pequeños (y encima poder quedarte sin sprites en pantalla como demostraste con el Turtles in Time). Los autores del Rex Nobillis y del Till & Hat han elegido la primera opción y creo que han hecho bien, yo haría lo mismo.
Aquí en esta publicación el autor de Till&Hat está optimizando para eliminar el parpadeo de sprites
https://x.com/SokZaJelo/status/20828928 ... 33/video/1
Snes escribió:Aquí en esta publicación el autor de Till&Hat está optimizando para eliminar el parpadeo de sprites
https://x.com/SokZaJelo/status/20828928 ... 33/video/1

Ahí habla de cosas que hace para reducir el consumo de CPU, no para reducir el parpadeo de sprites. A la PPU le da igual lo que haga la CPU a la hora de mostrar sprites.
Snes escribió:Aquí en esta publicación el autor de Till&Hat está optimizando para eliminar el parpadeo de sprites
https://x.com/SokZaJelo/status/20828928 ... 33/video/1


No habla de eliminarlos. Lo que entiendo es que habla de cómo araña ciclos mediante el uso de las coordenadas visibles del monitor independientemente del tilemap y del movimiento del scroll (usando coordenadas de 0 a 256 en X, 0 a 224 en Y) ya que son explosiones rápidas que no afectan realmente a lo visual en los escenarios que normalmente dan en el juego (Donde el jugador se detiene y empiezan a venir enemigos)

De hecho, en los comentarios del tweet confirma lo que Cirote3 había comentado anteriormente con el tamaño y rendimiento de sprites:
Imagen

EDIT: No vi tu comentario Cirote3, creo que le he repetido lo mismo de diferente forma XD
Se está hablando de optimización de sprites al mismo tiempo que se ahora ciclos de CPU
One way to optimize lots of sprites is to use screen-space coordinates.
The explosions use a single byte for their X/Y each, and exist only relative to the screen.
The small data size simplifies calculations and allows the use of Direct Page addressing, further saving cycles.
Snes escribió:Se está hablando de optimización de sprites al mismo tiempo que se ahora ciclos de CPU
One way to optimize lots of sprites is to use screen-space coordinates.
The explosions use a single byte for their X/Y each, and exist only relative to the screen.
The small data size simplifies calculations and allows the use of Direct Page addressing, further saving cycles.

Se refiere a que está optimizando el consumo de CPU a la hora de manejar sprites, no a que esa reducción en el uso de CPU vaya a ayudar a reducir el parpadeo de sprites.

En sistemas como la N64 reducir el consumo de CPU ayuda a poder mostrar más polígonos en pantalla, ya que tanto la CPU como la "GPU" acceden a la misma memoria y se bloquean la una a la otra. Sin embargo, en la mayoría de las consolas 2D la CPU y la "GPU" son totalmente independientes y no se bloquean, por lo que puede que hayan juegos con parpadeos de sprites sin usar la CPU casi nada y juegos sin parpadeos de sprites pero con ralentizaciones por culpa de la CPU.
15 respuestas