¿Cómo trabajaban las consolas con resoluciones entrelazadas?

En otro hilo se ha desviado el tema en varias ocasiones y en una de ellas se ha empezado a hablar de la resolución que muestra la demo Ridge Racer Hi Spec de Playstation a la vez que funciona a 60 fps. Respecto a ese tema se han aportado datos y explicaciones destacables, y la discusión a evolucionado en varios temas ya muy alejados de la intención principal de hilo. Así que he creado este nuevo hilo para seguir debatiendo aquí y dejar tranquilo el hilo original como han sugerido varios foreros con toda la razón del mundo. Voy a poner los mensajes que considero que aportan más información.

La primera mención al modo entrelazado del Ridge Racer Hi Spec se produce aquí.
Después se empieza la típica guerra de consolas hasta que llega un momento en que la conversación se centra en la resolución de dicho juego: sobre si renderiza internamente a 320x240 y duplica las líneas o si renderiza internamente a 320x480 reales.


Unos mensajes después se muestran fotos de la VRAM sacadas de emulador.
cirote3 escribió:El no$psx tiene un visor de VRAM en el que se muestran las texturas y la imagen con la que se trabaja a resolución interna. Adivina qué pantallazo es del port original y cuál es de la Hi Spec demo:

Imagen

Imagen

Como se puede ver "con el ojo desnudo" XD, la Hi Spec demo maneja una imagen interna al doble de resolución vertical, con los polígonos sin escalar en el eje vertical (a resolución nativa).


Anteriormente hay un mensaje muy técnico de Misscelan que merece la pena rescatar:
Misscelan escribió:Sobre el tema del interlaced y los FPS. En el caso de PSX, no es lo mismo renderizar 480i ni para la GPU ni para la CPU.

Cuando se usa interlaced en PSX, la GPU debería alternar la escritura de líneas, ósea las líneas pares estarán en un frame, y las impares en otro, si el emulador no muestra eso quizás no lo está emulando correctamente (o tiene dos buffers a ese tamaño!?). Pero el coste para la PSX es significativamente más grande, porque la GPU hace prácticamente el proceso de renderizado normal, pero solo se salta el última paso de escritura al buffer. Hace mucho tiempo se hicieron ejemplos de esto en psxdev pero ahora no los encuentro

La GPU de PS1 es bastante competente y me imagino que podría soportar un 480p en este escenario, el principal problema es que con dos buffers así te comes la VRAM y no hay casi espacio para texturas.
Después está obviamente el hecho de que a 60fps entrelazados o no, obligas a la CPU a transformar y proyectar todos los polígonos en menos de 16.6ms en vez de 33ms. Aunque en este caso la carga de la CPU debería ser más liviana al tener menos coches.

Yo sobre el tema de los datos con Turbo (el modo “PSX”) soy muy escéptico sobre que el rendimiento se triplique en un escenario real (Igual que también soy escéptico sobre que se puedan alcanzar en ps1 240 polígonos texturizados en un escenario real).

Por las pruebas que he hecho el peso sobre todo son los accesos a memoria. Puedes ganar algo de rendimiento en otros casos, pero no será comparable al ahorrarte accesos a memoria.
Dos casos eran los más flagrantes dentro de los accesos a memoria, subida de texturas y cluts a TMEM, acceso a los buffers tanto de color como el z-buffer.

-Las texturas y los cluts, son algo inevitable, solo puedes reducir el tamaño, agrupar los polígonos por material para reducir las subidas y por última usar porcas texturas con el fin de limitar cambios también.

Respecto a los buffers, la N64 tiene un span buffer (un buffer para líneas de 16*9 bytes con el fin de no tener que ahogar la memoria accediendo pixel a pixel). Si necesitas algo del buffer de color que no tienes, como por ejemplo para hacer una transparencia o para acceder al zbuffer pues la subes al span buffer, escribes lo que tengas que escribir en el span buffer y luego del span buffer lo guardas al buffer correspondiente. Cada carga/descarga del span buffer a los buffers normales bloqueas el bus y no dejas que nadie más acceda. Así por ejemplo un buffer de 32 bits dejará menos espacio para almacenar nuevas líneas en el span y molestará más al bus, lo mismo si tienes que acceder al z-buffer.

-El z-buffer se puede desactivar, pero como ha mencionado Conker es que por una parte requiere que hagas tú el ordenamiento de polígonos que puede consumir tanto recursos de CPU como bus, así como te puede afectar al agrupamiento por materiales por lo que puede generar subidas más frecuentes de texturas a TMEM. Además en casos con excesivo overdraw puede ser hasta contraproducente.

-La precisión subpíxel y la corrección por perspectiva, creo que no son parte de un estado configurable para la GPU. Pero se pueden desactivar pasando los parámetros adecuados.
El subpíxel son 2 bits en las coordenadas X e Y que recibe la GPU. La GPU recibe estas coordenadas en formato 16.16. Las primeras son lo que se consideraría el valor absoluto y de las segundas solo se usarían los susodichos 2 bits. Yo he probado a limpiar esos dos bits, todo se vuelven “flan-a-la-PSX” pero el rendimiento no parecía cambiar. Lo que tendría sentido ya que el subpíxel solo debería actual en las aristas internas y esos valores deberían estar en el span buffer de cualquier manera para una texturización normal.

-la corrección de perspectiva, es sobre todo calculada en el RSP (o la CPU) que necesita calcular la 1/W para pasársela la GPU, puedes pasar ese valor como 1 y con eso haces que deje de funcionar la corrección de perspectiva. En mi escenario solo tuvo implicaciones en la CPU (todavía no lo hago en el RSP) pero no hubo cambios en los FPS porque en mi escenario está limitado por la memoria no por el proceso, podría dar algún resultado en juegos limitados por proceso

-El antialiasing, en mi caso tenía un cambio de entre 2/5 fps. Aunque este proceso también requiere de acceder al buffer de color, supongo de que el hecho de que sea la fase final el VI puede trabajar con volúmenes de datos más grandes, en vez de micro accesos. El VI también solo debería tocar las aristas externas, así que me imagino que por ejemplo un escenario con un montón de partículas pequeñitas (todo aristas externas) tiene que tener mucho más trabajo que renderizar un quad gigante que ocupe casi toda la pantalla.

-Sobre modo de dos ciclos no he hecho pruebas, pero ya el hecho de tener que tener otra texturas en TMEM significa más estrés para el bus. Así que por esa parte mal, pero luego 2 cycle mode también permite que puedes subir texturas más pequeñas y enmascarar una bajar resolución con un segundo pase a diferente escala.

El turbo code también parece desactivar el cálculo de luces dinámicas y el clipping!? Esto no tiene mucho que ver con dejarlo tipo ps1 pero si entonces no hacen clipping espera que el usuario lo haga en la CPU? O que tesele y empuje la Z? no veo como va a ser eso más rápido en la CPU.



De nuevo Misscelan postea dos imágenes tiradas al monitor con ambos juegos corriendo en una PlayStation (a través de PSIO y no de los discos originales, aunque debería funcionar igual).
Misscelan escribió:
DefMod escribió:@Misscelan Si parece que aquí el único que tiene la PS1 de verdad soy yo [carcajad], pero ni poniéndolo fácil y dando indicaciones para verlo en directo en emuladores se atreven.

Imagen
Imagen


Esto lo lanzo desde PSIO, no sé que métodos usas tú, o que tele tienes. No están exactamente en el mismo punto pero creo que se ve la diferencia.

Puede existir una conspiración judeo masónica que haga que todos los emuladores digan que sale a 480i, que muestren la VRAM renderizando internamente a 480, o que se invente un modo que desconocido en la PS1(por lo menos yo no conozco un modo que renderize dos líneas iguales al mismo tiempo), o no sé, puede ser que el juego vaya a 480i renderizando líneas diferentes de cada vez, no sé tampoco es que esto sea el Crysis para pensar que es algo inconcebible.



Se pone como ejemplo otro juego, esta vez un homebrew de Nintendo 64, que también renderiza en entrelazado a 60 fps. Lo hace una resolución de 64x480.
dirtymagic escribió:Lo que muestra la captura de @cirote3 es que a 320x240 usa 2 buffer de imagen y a 320x480 es un solo buffer que mediante entrelazado intercala la lineas pares e impares, algo parecido a lo que hace este juego homebrew de N64

Lo que no tengo tan claro es si a la consola le cuesta más o menos renderizar un 1 buffer de 320x480 que 2 de 320x240.
En la descripción del video dice un poco por encima como lo a hecho.

Yo no tengo PSX, para probar, pero si funciona como el Driving Strikers 64, que si lo he probado en consola, si que da la sensación de tener más resolución y se ve bien, así que como truco está bien.

Salud.



También se menciona que los juegos de la siguiente generación que funcionan en 480i entrelazado pueden parchearse para forzarlos a 480p, pero que algunos no se ven en progresivo ni por esas. Lo que sugiere que para sacar la imagen en la televisión por entrelazado hay varias formas.
naxeras escribió:
SuperPadLand escribió:Entiendo que lo de no sacarlos en progresivo es porque los CRT de entonces no soportaba 480p no?


PSX no tiene salida a 480p lo tiene que sacar a 480i y si, era raro un CRT a 480p, piensa que PS2, Dreamcast y CUBE lo normal es que renderizaran a 480p pero luego mostraban 480i.

SuperPadLand escribió:Que parches hay en PS1 para forzar 240p?


Que yo sepa no hay ninguno ni yo he dicho que lo haya, lo que hay son juegos de PS2 que van a 480i y se pueden parchear a 480p ya que PS2 si soporta salida a 480p y como el juego se renderiza internamente a esa resolución pues la comunidad ha sacado cientos de parches. (ojo no todos los juegos a 480i de PS2 se renderizan nativamente a 480p).

Un Saludo.



Explicación de cómo funcionaban las teles de entonces y cómo estaba directamente relacionado con las resoluciones que se podían mostrar, los modos entrelazado y progresivo y una hipótesis que lanzo sobre cómo funciona el Ridge Racer Hi Spec.
Sogun escribió:Lo de las "resoluciones" de 240p y 480i se debe a cómo funcionaban los televisores de consumo (15 KHz).

Cuando se inventaron los televisores y se establecieron los distintos estándares no existían las consolas y estaban pensados únicamente para retransmisiones en directo. Centrándonos en el estándar NTSC, estos televisores pueden pintar pintar unas 480 líneas, pero no pueden hacerlo de una tacada. Así que dividen la misma imagen en dos campos, uno con las líneas impares y otro con las pares. Cada uno de estos campos se dibuja en 1/60 segundos, lo que significa que las televisiones mostraban 30 imágenes por segundo. Dividir la imagen en dos campos es lo que se conoce como entralazado; la "i" de los 480i (interlaced).

Otro aspecto muy importante a tener en cuenta es que en las televisiones no existe la resolución horizontal ni dibuja píxeles. En horizontal hay "variaciones de color" que no tienen un valor fijo, aunque sí un máximo que podríamos decir que son 720 variaciones (no me sé el valor exacto, pero es superior a 640). Esto significa que los "píxeles" no son cuadrados, se estiran y se contraen, y que la resolución horizontal puede ser la que queramos. La resolución vertical, sin embargo, está encorsetada por esas 480 líneas visibles.

Los 240p de las consolas no están contemplados en el estándar. Es una trampa que idearon los ingenieros de las consolas porque éstas no podían generar los datos con la suficiente velocidad como para llenar la pantalla. Dando la orden de que los dos campos se dibujen uno encima de otro se reduce la resolución vertical a la mitad. La "p" (progresivo) de los 240p significa justamente eso, se dibujan siempre las mismas líneas. La resolución horizontal hemos visto que puede ser cualquiera. Si aún así no diera tiempo a dibujar la pantalla entera, lo que se hace es justamente dejar de dibujar esas líneas. Por ejemplo, la resolución de la Atari 2600 es de 40 píxeles en horizontal y 192 lineas verticales de las 240 visibles (quedan franjas negras arriba y abajo, parcialmente ocultas por el overscan). Otro ejemplo es la Master System, que tiene una resolución de 256x192, que parecería que es una imagen que se adapta a la perfección al formato 4:3, pero en realidad llena la pantalla en horizontal y tiene franjas negras arriba y abajo. Para rellenar la pantalla, la imagen tiene que tener 240 píxeles de resolución vertical (como la NES), aunque si tenemos en cuenta el overscan tampoco se verían franjas negras con 224 líneas verticales (dependería del televisor).

En las consolas de quinta generación (Saturn, PlayStation y Nintendo 64) ya hay suficiente potencia y flexibilidad para jugar con todo tipo de resoluciones. Cada consola tiene sus propias peculiaridades, pero siempre estarán encorsetadas por la tecnología en la que se muestran (televisores de consumo, de 15 kHz).
-Saturn puede componer la imagen final a partir de varias capas con distintas resoluciones. Los ejemplos de juegos de lucha con resoluciones entorno a los 700x480 son tramposos. Los marcadores sí que se muestran a esa resolución, pero los elementos 3D y los fondos están a una resolución inferior.
-Nintendo 64 renderiza internamente a cualquier resolución (por ejemplo 400x300, o 558x441, o 296x208) y luego la escala a 640x480. Este proceso de escalado es el mayor culpable de la borrosidad de la imagen. Esto no significa que se vea siempre en entrelazado: se descarta la mitad de las líneas horizontales para mostrar la imagen en progresivo si es lo que se desea.
-PlayStation es más sencilla. En el caso que se discute del Ridge Racer Hi Spec lo que ocurre es que renderiza internamente la imagen a 320x480 y, como no puede mostrar la imagen entera en un campo, dibuja las líneas impares en un campo, ACTUALIZA la imagen antes de que se empiece a dibujar el siguiente campo, y dibuja las líneas pares en la siguiente pasada. Actualiza la imagen 60 veces por segundo, dibuja las 480 visibles del televisor, pero en cada paso sólo dibuja 240 líneas. Si hiciésemos una foto a la televisión que sólo capturase un campo, contaríamos 320x240 píxeles. El juego renderiza a 320x480 pero no los puede mostrar por las limitaciones del televisor (y porque la PlayStation fue diseñada con esas limitaciones en mente).

Es absurdo pedirle a estos sistemas que muestren resoluciones de 512x384 por ejemplo, porque lo que falla es el televisor. Las máquinas arcade sí podían porque usaban monitores de 24 kHz.

DreamCast, con su salida VGA preparada para monitores de ordenador de 31kHz que sí soportaban mayores resoluciones y refrescos, fue la primera en mostrar 480 líneas simultáneamente (480p).




Pero Misscelan me corrige:
Misscelan escribió:
Sogun escribió:...El juego renderiza a 320x480 pero no los puede mostrar por las limitaciones del televisor.

Esta parte justo es la que no me cuadra (por lo demás excelente post). A lo mejor me estoy perdiendo algo pero sigo sin ver eso posible salvo que el juego tenga screen tearing, lo cual yo no noté por lo menos. O te refieres a que solo actualiza impares/pares en el screen buffer?

Esto a lo cutre sería la representación del frame 1, a la izquierda está el screen buffer de ps1 a la derecha la TV. El DAC va pasando las líneas verdes a la tele para que las muestre.

Imagen

Una vez el haz de electrones de la CRT llega a la esquina de abajo a la derecha de la tele (a terminado de pintar las líneas impares), tienes poco más de 1ms para actualizar todo el frame buffer. El haz vuelve a la parte de arriba a la izquierda y empieza el proceso de nuevo, esta vez el DAC le pasa solo las líneas pares.

Pero es imposible que la ps1 renderize toda esa escena en poco más de 1 ms, ósea la ps1 tiene que estar pintando en el screen buffer a la misma vez que el dac le pasa la info para que el haz de electrones lo pinte en la TV, si dejas que en este momento la ps1 pinte en las líneas pares vas a estar corrompiendo la imagen, porque la ps1 va a rasterizar en puntos aleatorios del screen buffer, lo mismo empieza pintando en la esquina derecha cuando no se ha pasado por ahí al haz y termina escribiendo en la parte izquierda arriba cuando el haz ya ha mandado la imagen. Para eso principalmente existen los double buffer para que no pintes donde está leyendo la tele en ese momento.

Por eso pienso que es un riesgo innecesario dejar que actualice las líneas que el DAC está pasando a la tele, si además es la opción por defecto y visualmente el resultado va a ser el mismo.

He probado por ejemplo Tekken3 en no-cash (otro interlaced) y el resultado es el mismo, un screen buffer uniforme, lo que huele a que los emuladores solo se están facilitando el poder ofrecer estos en progresivo.

No sé si me estoy perdiendo algo.



Así que lanzo otra hipótesis tras investigar un poco sobre el "field rendering":
Sogun escribió:
Misscelan escribió:Una vez el haz de electrones de la CRT llega a la esquina de abajo a la derecha de la tele (a terminado de pintar las líneas impares), tienes poco más de 1ms para actualizar todo el frame buffer. El haz vuelve a la parte de arriba a la izquierda y empieza el proceso de nuevo, esta vez el DAC le pasa solo las líneas pares.

Pero es imposible que la ps1 renderize toda esa escena en poco más de 1 ms


Pues tienes toda la razón. No había caído en eso. Últimamente me estoy empapando de cómo funcionan las consolas 2D y éstas sí que actualizan el frame durante el V-blank. Pueden hacerlo porque tienen todos los elementos previamente dibujados y "sólo" hay que ponerlos en su sitio. Pero para escenas 3D necesitas al menos doble buffer para tener algo que poner en pantalla por si no da tiempo a dibujar el nuevo frame para el siguiente refresco de pantalla.
El caso es que cuando subieron las dos imágenes comparativas de las VRAM ya me pareció raro que en la de Hi Spec sólo se mostrara un buffer. Pero luego mientras escribía el mensaje, que me llevó bastante tiempo, se me fue de la cabeza.

Mientras escribo esto estoy investigando acerca del "field rendering" y quizás es lo que están usando aquí y también explicaría lo que se ha hablado de los juegos de PS2 en los que no se puede forzar el progresivo. Aunque me hago una idea de cómo funciona, me surgen varias dudas. Así que espero que alguien me pueda corregir si lo que pongo no es correcto o es impreciso. Básicamente, el buffer de 320x480 contiene dos frames mezclados, con las líneas impares formando la imagen que se mostrará en el primer campo y las líneas pares formando la imagen del segundo campo. Creo que el proceso funciona de la siguiente manera:
-Se renderiza el primer frame a 320x480, pero sólo se dibujan en VRAM las líneas impares, dejando intervalos vacíos de 1 píxel. Teóricamente se tardaría lo mismo en renderizar esto que un frame para un juego en progresivo a 320x240 de resolución. Como directamente se sabe de antemano que no se van a mostrar la líneas pares, no se gastan recursos en calcular lo que hay ahí. A la hora de mostrarlo en pantalla, también se manda saltando la líneas de píxeles pares del buffer para coincidir con el campo de la televisión.
-Mientras se dibuja el primer campo se renderiza el segundo frame también a 320x480, pero esta vez sólo se dibujan en VRAM las líneas pares, rellenando los huecos que quedaban después de renderizar el primer frame. Y se manda a la televisión saltándose las líneas impares del buffer para que coincida con el segundo campo.
-Mientras se dibuja el segundo campo, se actualizan las líneas impares del buffer de 320x480 con el tercer frame. Y así todo el rato.

En las comparativas de VRAM que se postearon antes, hice zoom en la del Hi Spec para ver si había líneas repetidas como se estaba discutiendo en ese momento. Pero la imagen es genuinamente 320x480 (bueno, tiene bandas negras arriba y abajo y queda en 320x455). Sólo se aprecia doble línea en el cielo porque la textura está estirada para pasar de 240 píxeles de alto al equivalente de 480.

Como en ese momento no se mueve nada en el juego, es imposible saber si lo que se muestra son dos frames mezclados siguiendo el proceso que he descrito antes, o si es un único frame renderizado a 320x480. Si lo que he puesto más arriba funciona de esa manera, cuando el juego tuviera movimiento se verían los artefactos del entrelazado en el framebuffer. A ver si alguien puede mostrar una captura del frambuffer del Hi Spec mientras se toma una curva a gran velocidad. Cuanto más desplazamiento horizontal de la imagen, mejor.

Si intentáramos forzar el juego en progresivo mostrando las 480 líneas a la vez, como se podía hacer a partir de DreamCast con los medios adecuados, no podríamos evitar los artefactos del entrelazado. Creo que sería incluso peor, porque sería como ver dos vídeos corriendo a 30 fps superpuestos uno encima del otro. Con entrelazado se ve una imagen en cada refresco que se va actualizando con cada pasada, pero en progresivo se verían dos imágenes mezcladas que permanecerían durante 2 refrescos y que se actualizarían intermitentemente.



Pero viendo cómo se actualiza la VRAM en el emulador no se puede afirmar que mi segunda hipótesis sea correcta:
cirote3 escribió:
Sogun escribió:A ver si alguien puede mostrar una captura del frambuffer del Hi Spec mientras se toma una curva a gran velocidad. Cuanto más desplazamiento horizontal de la imagen, mejor.

Yo con el visor de VRAM del no$psx no consigo ver defectos de entrelazado cuando se toman curvas, la imagen de 320x480 se actualiza al completo en cada frame (a 60FPS).



Mensajes de EMaDeLoC y Miscellan hablando más en detalle de cómo trabaja la PlayStation en entrelazado.
EMaDeLoC escribió:
Misscelan escribió:
Sogun escribió:...El juego renderiza a 320x480 pero no los puede mostrar por las limitaciones del televisor.

Esta parte justo es la que no me cuadra (por lo demás excelente post). A lo mejor me estoy perdiendo algo pero sigo sin ver eso posible salvo que el juego tenga screen tearing, lo cual yo no noté por lo menos. O te refieres a que solo actualiza impares/pares en el screen buffer?

Quizá me equivoco, pero creo que lo que lleva a error es la captura mostrando un solo framebuffer de 320x480. Que yo sepa la consola siempre tiene dos, uno de un campo y otro de otro campo, o uno de un frame y el otro del siguiente frame si esta configurada a 240p. Vamos, tal cual sale en la captura anterior a la que digo.

La VRAM de PS1 puede leer a la vez que escribe en otra dirección de memoria. Por eso puede leer un frame/campo mientras renderiza otro.
Si realmente la consola maneja un solo framebuffer de 320x480 (que no lo creo), también podría leer líneas de un campo mientras dibuja líneas de otro. Pero como digo creo que tienen que ser dos regiones de memoria distintas con los datos continuos, no va preparada para saltar líneas (o direcciones de memoria) de un solo framebuffer.

El programa lo que hace es mostrar un solo framebuffer para resaltar que es una resolución superior.

Pero vamos, es lo que me cuadra a mí, quizá me equivoque.


Misscelan escribió:@EMaDeLoC
Creo que al final estamos todos hablando más o menos de lo mismo, pero es difícil ponerlo en palabras.
Esto es una captura de un manual de desarrollo de la PS1.
Imagen

Lo que comenta es básicamente que cuando configuras entrelazado, el comportamiento por defecto es que tú puedes escribir en las líneas pares y tienes prohibido en las impares que son las que el DAC le pasa a tele, cuando empieza un nuevo frame el comportamiento par/impar se invierte.
Puedes alterar el comportamiento por defecto cambiando la flag que indican y renderizar todo, pero el DAC seguiría pasando pares en un frame a impares en otra (así que ahora mismo no le veo mucho sentido a activar esa flag).

La duda principal que plantea Cirote3 es porque todos los emuladores muestran la imagen entera en progresivo y ahí es donde cada uno tiene sus teorías.

La PS1 realmente está realizando el proceso de rasterizado de las dos líneas la pares y la impares en cada frame, pero el proceso no termina transfiriendo el contenido de la línea que tiene bloqueada para el DAC al buffer de pantalla. Desde el punto de vista de desempeño es prácticamente como si estuviese rellenando todo el buffer (los 320x480 píxels). Y aquí es donde empieza mi teoría, para que el emulador tenga unos timings parecidos a la GPU en la realidad, va hacer todo el proceso, solo que en el caso de los emuladores lo termina trasfiriendo porque así le permite mostrar en progresivo y no tener que gestionar el pitote que sería de la otra manera en pantallas actuales. Pero esto es solo mi teoría, pero no se me ocurre otra que no resultase con screen tearing.

La única manera que se me ocurre para salir de dudas, sería o preguntarle al creador de cualquier emulador, o usar Caetla en un Xplorer y hacer una dump de la VRAM mientras se juega.

Y creo que la gente que se queja del offtopic tiene razón. Así que este es mi último post sobre el interlaced en RR.



Y por último cirote3 plantea buscar otros emuladores con visor de VRAM y comparar su comportamiento.
cirote3 escribió:La ventana de juego del no$psx muestra 240 líneas, sin filtros (los emuladores no$ no suelen llevar filtros). Es el visor de VRAM el que muestra la imagen de 320x480 actualizándose al completo en cada frame a 60FPS. Igual probando con el visor de VRAM de otros emuladores (no sé si hay más con visores de ese tipo) se puede sacar una conclusión.



Sería interesante resolver el misterio del Ridge Racer Hi Spec. También ver si otros juegos de PlayStation con entrelazado funciona de la misma manera. Comparar con las otras consolas de esa generación y comentar lo que ocurre con los juegos de la siguiente. También hay ejemplos de juegos con imagen entrelazada en las consolas de 16 bits. Puede que alguien sepa ejemplos de juegos en entrelazado en otros sistemas que también estaría bien dar a conocer.

Al final es inevitable cruzar juegos y enfrentar consolas, pero intentemos ser los más asépticos y respetuosos posible.
Creo que la consola genera a la vez que va pintando en la pantalla.

La consola usa doble buffer. Crea una imagen con lineas pares a 320x240. Manda esa imagen a la pantalla y la tele pinta en el primer frame esas lineas pares. Mientras, se está generando el segundo frame con lineas impares tambien a 320x240. Cuando termina de pintar el primer frame con lineas pares, lee el segundo buffer con lineas impares y las pinta en pantalla mientras se empieza de nuevo a crear el primer buffer con lineas pares del siguiente frame. Y así sucesivamente.

El parpadeo se da porque con cada pasada que refresca lineas pares o impares, las otras lineas pintadas en el frame anterior se van "apagando" y están al 70% de brillo o intensidad. Esta diferencia con respecto a las nuevas lineas pintadas que están al 100% es lo que produce el parpadeo.

El proceso de crear cada nueva imagen lleva menos tiempo que pintar una imagen en pantalla pues si no, no podría ir a 60 fps estables.

Y me parece que ya está. No creo que haya más misterio. Así se consiguen 320x480 a 60 fps con la potencia de poder generar 60 imágenes a 320x240.

Saludos.
Supongo que en las consolas de 16bits más populares hay menos misterio porque funcionan sin frame buffers, lo que se muestra en pantalla lo pinta en caliente el chip gráfico. Como dije, estaría bien probar con el visor de VRAM de otros emuladores que no sea el no$psx (no sé si hay más con visores de ese tipo).


Seideraco escribió:Creo que la consola genera a la vez que va pintando en la pantalla.

La consola usa doble buffer. Crea una imagen con lineas pares a 320x240. Manda esa imagen a la pantalla y la tele pinta en el primer frame esas lineas pares. Mientras se está generando el segundo frame con lineas impares tambien a 320x240. Cuando termina de pintar el primer frame con lineas pares, lee el segundo buffer con lineas impares y las pinta en pantalla mientras se empieza de nuevo a crear el primer buffer con lineas pares del siguiente frame. Y así sucesivamente.

El parpadeo se da porque con cada pasada que refresca lineas pares o impares, las otras lineas pintadas en el frame anterior se van "apagando" y están al 70% de brillo o intensidad. Esta diferencia con respecto a las nuevas lineas pintadas que están al 100% es lo que produce el parpadeo.

El proceso de crear cada nueva imagen lleva menos tiempo que pintar una imagen en pantalla pues si no, no podría ir a 60 fps estables.

Y me parece que ya está. No creo que haya más misterio. Así se consiguen 320x480 a 60 fps con la potencia de poder generar 60 imágenes a 320x240.

Saludos.

Como ya he dicho varias veces, el visor de VRAM del no$psx muestra una imagen de 320x480 que se actualiza al completo, sin saltarse líneas, a 60FPS.
cirote3 escribió:Como ya he dicho varias veces, el visor de VRAM del no$psx muestra una imagen de 320x480 que se actualiza al completo, sin saltarse líneas, a 60FPS.


Huele a truco de emulador para poder visualiar el juego en progresivo. Una vez que dispones de 20 veces o más la potencia de Psx,seguro que puedes hacer trucos como doblar la velocidad de procesado del motor gráfico y poder generar una imagen completa en progresivo en cada frame.

Pero eso no tendría sentido en una consola real. Sería un desperdicio de recursos extremadamente cafre. Y un aumento de potencia con respecto a lo que consiguieron en el primer Ridge Racer descomunal. Por que pasan de 320x240 a 30 fps... a 320x480 a 60 fps. Algo falla ahí

¿No había un software por ahí que permitía monitorear el rendimiento y mostrar información de los juegos en funcionamiento? Lo que usaron para optimizar juegos a partir de Gran Turismo y conseguir aprovechar más la máquina. No sé si esto se podría usar junto al Ridge Racer Hi Spec, estoy hablando por hablar en estos momentos.

Para asegurarse habría que hablar o con los programadores de los emuladores o con los programadores del Ridge Racer Hi Spec de Namco.

De todas formas, la técnica de usar entrelazado para conseguir doblar resolución en esas máquinas es como he comentado. El sistema no puede generar la imagen a tan alta resolución pero sí puede hacerlo en dos pasadas usando entrelazado. El Amiga al menos funcionaba así. Conseguías 640x400 a partir de dos imágenes a 320x200... aunque aquí se dobla resolución vertical y horizontal mientras que en el Ridge Racer Hi Spec solo se dobla la resolución vertical. Qué raro...

Saludos.
este ridge racer "hi spec" siempre me ha dado dolor de cabeza, en un crt con la consola original la imagen parpadea de una manera muy molesta, mucho mas exagerado que en otros juegos
Yo es que lo que más lógico( que no tiene porque ser lo que haga la PSX) me parecía es que en vez de intercalar 60 frames de 320x240 en doble-buffer en 1 segundo, renderiza 30 frames de 1 buffer de 320x480, que ocupa lo mismo en VRAM y tal vez consuma los mismos recursos que los 2 buffer a 320x240 ya que es la misma densidad de pixeles y la consola lo que hace con ese buffer es mandar las lineas pares,manda las lineas impares y renderiza las pares,manda las impares y renderiza las pares,en bucle, así es como pensaba que lo hacía.

Lo del Driving Strikers 64, es un locurón porque usa 3 Buffers de 640x480 por lo que dice el autor en los comentarios de Youtube.

Salud.
magrosomohoso escribió:este ridge racer "hi spec" siempre me ha dado dolor de cabeza, en un crt con la consola original la imagen parpadea de una manera muy molesta, mucho mas exagerado que en otros juegos

Lógico que parpadee. Está usando un modo entrelazado de 320x480. Pero con eso consigue doblar la resolución vertical del Ridge Racer original.

Y el juego por otra parte tambien doble el framerate. Es una buena demo técnica para probar de lo que es capaz el hardware de Playstation. Que haga algo así una consola de 1994 tiene mucho mérito.

A mí el dolor de cabeza me lo está dando averiguar cómo funciona internamente para generar dicha resolución de 320x480 en entrelazado.

La lógica me dice que genera imágenes a 320x240 y las intercala en cada frame cambiando lineas pares a impares en cada frame. Pero tambien cabe la extraña posibilidad de que genere una única imagen de 320x480 cada vez y envie dos señales a la TV usando dicha imagen, primero enviando lineas pares y luego impares.

Pero si hace esto... ¿cuando genera la siguiente imagen a 320x480? Y lo más importante... ¿dónde la genera? Porque el buffer está ocupado con la imagen anterior a 320x480 xD

Saludos.
Seideraco escribió:
magrosomohoso escribió:este ridge racer "hi spec" siempre me ha dado dolor de cabeza, en un crt con la consola original la imagen parpadea de una manera muy molesta, mucho mas exagerado que en otros juegos

Lógico que parpadee. Está usando un modo entrelazado de 320x480. Pero con eso consigue doblar la resolución vertical del Ridge Racer original.

no es por el entrelazado
he jugado a muchos juegos 480i, tanto en psx como en otras consolas, por ejemplo el tekken 3 de la misma consola no molesta ni por asomo tanto como este ridge racer
y en ps2 y gamecube los primeros juegos no solían llevar filtro antiparpadeo y aunque se notaba, no molestaba
recuerdo el virtua tennis 2 y el marvel vs capcom 2 de ps2, que también se notaba el parpadeo pero eso, podías jugar sin problemas

sin embargo este ridge racer hi spec se me hace insoportable y en 5 minutos lo tengo que quitar de lo que llega a molestar a la vista

siempre lo he llamado el "ridge racer epilepsia" [carcajad]

si jugais en emulador o en una tv lcd esto no lo veis claro está
magrosomohoso escribió:no es por el entrelazado
he jugado a muchos juegos 480i, tanto en psx como en otras consolas, por ejemplo el tekken 3 de la misma consola no molesta ni por asomo tanto como este ridge racer
y en ps2 y gamecube los primeros juegos no solían llevar filtro antiparpadeo y aunque se notaba, no molestaba
recuerdo el virtua tennis 2 y el marvel vs capcom 2 de ps2, que también se notaba el parpadeo pero eso, podías jugar sin problemas

sin embargo este ridge racer hi spec se me hace insoportable y en 5 minutos lo tengo que quitar de lo que llega a molestar a la vista

siempre lo he llamado el "ridge racer epilepsia" [carcajad]

si jugais en emulador o en una tv lcd esto no lo veis claro está

Mucho peor el Ridge Racer V de Ps2 que el Ridge Racer Hi Spec de Ps1. El V de ps2 sí que hacía daño a la vista por el parpadeo terrible y los jaggies.

Los primeros juegos de Ps2 eran horribles en este aspecto porque no implementaban antialiasing y no veas el flickering y los jaggies que nos tuvimos que comer.

Al Ridge Racer hi Spec me hinché a jugar en su momento en mi Playstation, nada de emulación. La emulación la uso hoy día porque es mucho más práctica y ofrece muchas ventajas con respecto a jugar en el hardware real.

De todas formas tu mensaje no ayuda nada a saber cómo funciona internamente Playstation para generar y crear cada frame del Ridge Racer Hi Spec, que es de lo que trata este hilo.

Yo por mi parte le acabo de mandar un correo electrónico a Fabien Sanglard comentándole el asunto a ver si puede echarnos una mano. Estaría bien que escribiera un artículo al respecto en su blog.

https://fabiensanglard.net/

Saludos.
Seideraco escribió:Creo que la consola genera a la vez que va pintando en la pantalla.

La consola usa doble buffer. Crea una imagen con lineas pares a 320x240. Manda esa imagen a la pantalla y la tele pinta en el primer frame esas lineas pares. Mientras, se está generando el segundo frame con lineas impares tambien a 320x240. Cuando termina de pintar el primer frame con lineas pares, lee el segundo buffer con lineas impares y las pinta en pantalla mientras se empieza de nuevo a crear el primer buffer con lineas pares del siguiente frame. Y así sucesivamente.

El parpadeo se da porque con cada pasada que refresca lineas pares o impares, las otras lineas pintadas en el frame anterior se van "apagando" y están al 70% de brillo o intensidad. Esta diferencia con respecto a las nuevas lineas pintadas que están al 100% es lo que produce el parpadeo.

El proceso de crear cada nueva imagen lleva menos tiempo que pintar una imagen en pantalla pues si no, no podría ir a 60 fps estables.

Y me parece que ya está. No creo que haya más misterio. Así se consiguen 320x480 a 60 fps con la potencia de poder generar 60 imágenes a 320x240.

Saludos.


Esa es la explicación.
@cirote3 Me ha contestado Fabien Sanglard acerca de cómo funciona el Ridge Racer Hi Spec, sobre si usa uno o dos buffers para crear los 320x480... y mira lo que me ha dicho...

"You don't need two buffers as long as your engine is synced to the vsync.

The best way to answer that is to load ridge Racer in an emulator and look at the mode it is using."

Al final vas a tener razón y el juego va a usar un único buffer a 320x480 para crear todo el juego xD

Saludos.
De la PSX sé entre poco y nada, así que seguramente lo que voy a decir no funcione, pero una forma de trabajar con un solo frame buffer si la PSX lo soportara sería renderizar polígonos fuera del scanline line actual: por ejemplo, si el scanline actual está en la parte inferior de la pantalla, renderizar polígonos de la parte superior de la misma. Peores cosas había que hacer para mostrar gráficos en la Atari 2600, ¿no? XD
cirote3 escribió:De la PSX sé entre poco y nada, así que seguramente lo que voy a decir no funcione, pero una forma de trabajar con un solo frame buffer si la PSX lo soportara sería renderizar polígonos fuera del scanline line actual: por ejemplo, si el scanline actual está en la parte inferior de la pantalla, renderizar polígonos de la parte superior de la misma. Peores cosas había que hacer para mostrar gráficos en la Atari 2600, ¿no? XD

Yo creo que no es tan complicado. Igual que la Psx es capaz de enviar lineas pares o impares a la pantalla, seguro que tambien es capaz de trabajar unicamente en lineas pares o impares del framebuffer. Aunque parezca algo poco práctico para nosotros, igual para la Psx es lo más normal del mundo y lo hace sin problemas.

Aunque nosotros veamos la imagen como un único framebuffer, para la PSX puede que sean dos framebuffers juntos y fusionados.

Poco a poco se ira desvelando el misterio. A ver si encuentro a alguien más que esté metido en el tema para preguntarle al respecto.

Saludos.
Hablando del tema con un desarrollador de PSX:

high vertical resolution requires interlaced mode, which I assume the game has enabled. in this mode, the gpu not only scans out only even/odd lines, but it also masks draw calls to only odd/even lines in the framebuffer. this effectively creates two interleaved buffers. few emulators emulate the interlaced drawing, though.


Según esta lista, el Xebra es el único emulador que muestra bien los modos entrelazados. Un pantallazo de la VRAM en el Xebra con el RR Turbo Mode:

Imagen
Pues el misterio parece resuelto. Un buffer grandote de 320x480 con el que la Psx trabaja a la vez que envia la parte que necesita a la pantalla.

Muy curioso tambien que solo un emulador represente esto bien en la VRAM.

Voy a tener que probar ese Xebra a ver qué tal va.

Saludos.
cirote3 escribió:Hablando del tema con un desarrollador de PSX:

high vertical resolution requires interlaced mode, which I assume the game has enabled. in this mode, the gpu not only scans out only even/odd lines, but it also masks draw calls to only odd/even lines in the framebuffer. this effectively creates two interleaved buffers. few emulators emulate the interlaced drawing, though.


Según esta lista, el Xebra es el único emulador que muestra bien los modos entrelazados. Un pantallazo de la VRAM en el Xebra con el RR Turbo Mode:

Imagen


No llegué a profundizar tanto en ese emulador, pero sí fue el que usé cuando caté el fullset y había cosas que en epsxe me parecían que no estaban siendo fieles (porque quemar 4000 discos para usar hardware original me daba perecita) y, creo, es el único emulador que realmente busca la excelencia 1:1 en emulación, al punto de que, no sé ahora, pero entonces no permitía aplicar ninguna mejora al juego en plan renderizar x4 y cosas así. Ahora uso duckstation por comodidad y para "original" consola y CRT (justo ahora ando tostando un juego de hecho).

Muy recomendado para quien no tenga una consola y quiera conocerla lo más pura posible sin dopar ni mejoraras artificiosas.
Lo del Driving Strikers es un ejemplo de algo que la PS1 nunca podrá tener, 3 buffers del tamaño de 640x480. De hecho, el único juego que conozco que tiene triple buffer es jumping flash (pero el buffer es de 256 pixeles solo de ancho – no sé qué hace el cuarto buffer ahí).

Aunque también hay que puntualizar que lo de Driving Strikers es “hasta” 60 fps, por esa razón hay 3 buffers, inicialmente pensaba que el juego iba a 30 o 60 fps locked y que el tercer buffer era para al HDR, pero al final resulta que es porque hay veces que el RDP no llega a tiempo y en esos casos el VI solo coge los dos que se han terminado.

Lo de que se molesten en renderizar las 480 líneas verticales siempre es porque si no el algoritmo de antialiasing y dither del VI no funcionarían correctamente. El dither funciona en toda la imagen, el antialiasing funciona solo en los píxeles donde los famosos bits escondidos (1 bit por cada 8 en el caso de buffers de 16 bits – en el caso de buffer de 32 bits creo que se puede guardar en el alpha) no den combinados la cobertura entera (3). Para realizar el subpíxel, el RDP marca esos bits dándoles valores entre 0 y 3 (estos valores se los manda el RSP y representan 25%, 50%, 75% y 100% de cobertura dentro de un pixel), cuando el RDP retoma la arista interna para otro polígono, va a leer esos valores del Span Buffer y va a complementar los valores de cada pixel rellenando el porcentaje de color que falta. Al llegar a una arista externa si marca por ejemplo 50%, como después no va a coincidir otra arista el valor queda incompleto. El VI se encarga de trabajar solo en esos píxeles, pero el algoritmo de antialiasing del VI a diferencia del de subpíxel busca píxeles a su alrededor (5x3 pixeles alrededor) para hacer la mezcla correcta y en este caso si tiene una fila de otro frame puede generar glitches.

En juegos de <= 30 fps lo que imagino que harán es tener dos buffers pero el VI se queda intercalando líneas horizontales (par/impar) del screen buffer tantos frames como sea necesario hasta que el back buffer haya sido pintado por completo. Molaría que algún emulador te dejase visualizar la RAM de N64 para poder investigar todas estas cosas.

El efecto de intercalar líneas (par/impar) de buffers diferentes añade la ilusión de mayor suavidad, pero esta ilusión solo funciona a altas velocidades (no he probado el Driving Strikers en tele normal, pero si hay bajones de FPS en momentos donde hay giros de cámara bruscos la ilusión se puede romper). Pero velocidades aparte, intercalar líneas de buffers diferentes causa principalmente dos problemas (que no tiene el supuesto método <= 30 fps).
- El ”temporal judder”: básicamente lo que se ve en la foto de Cirote3, las líneas de un buffer aparecen movidas respecto a los del otro buffer. Esto es más acuciado en juegos con mucho movimiento, en el caso de RR es especialmente molesto (por lo menos para mi porque la cámara es extremadamente brusca). En juegos como Resident Evil esto no es un gran problema.
- El “spatial judder”: simplificando, imagina una señal de baliza que se activa y desactiva en cada frame, pero cae siempre en las líneas impares, el jugador puede que nunca la vea encendida.

Cambiando un poco de plataforma, hace poco encontré otra anécdota sobre el modo entrelazado en la 3do, revisando la documentación oficial encontré esto:
Imagen

La 3do venía con modo 3d estereoscópico usando el entrelazado, en un ojo iban las líneas impares y en otro las pares.
Investigué un poco y al parecer iba a salir un juego junto con unas gafas, el juego se llamaba 3d Laser Blaster, más info aquí.
@Misscelan
Yo he probado el Driving Strikers 64 en CRT y hardware, tiene 3 modos gráficos:
Fastest: Este yo diría que siempre va a 60 Fps o como usa 3 buffers, no hace frameskip y si baja el rendimiento no salta directamente a 30 fps, diría que sólo tiene antialiasing en los coches.
Normal: Me da la sensación que en las introducciones del campo, cuando la visión de la cámara es muy abierta y muestra mucho escenario, va a 30 fps o al menos bastante menos de 60, en el juego a 60, tiene antialiasing completo.
Nicest : Gráficamente lo veo muy similar a normal, pero aquí me parece que siempre va por debajo de 60 fps.

El entrelazado se nota más en el modo Fastest, sobretodo en las parte donde hay mucho contraste de color entre partes del escenario, en los modos donde pone antialiasing se mitiga bastante.

Una duda, ¿se podría poner en progresivo a 640x480 si es a 30 fps o menos? o la tecnología del CRT solo permite entrelazado en esas resoluciones.

Salud.
@dirtymagic
Entiendo que funciona así también. Al tener 3 buffers no estás obligado a esperar a que llegue el retroceso vertical para poder empezar a pintar en el back buffer. Todos los juegos que usen 3 buffers, salvo que bloqueen el proceso de renderizado por cuenta propia pueden tener FPS desbloqueados.

Me parece que el VI puede llegar a cerca de 310 líneas verticales pero en las teles de la época creo que lo máximo que podrías mostrar son 288 en PAL (para progresivo) - el overscan.
19 respuestas