33 votos

¿Cómo consiguen su velocidad de fotogramas dispositivos como la Game Boy Advance?

He estado diseñando mi propio dispositivo de juegos de mano basado en un microcontrolador AVR y una pequeña pantalla OLED.

Empecé con una pantalla monocromática de 128x64 píxeles y puedo dibujar cómodamente en ella a más de 60 fotogramas por segundo.

Hace poco lo rehice para utilizar un OLED RGB de 128x128 píxeles sin pensar demasiado sólo para descubrir que sólo podía conseguir unos 4 FPS. ¡Después de un poco de pensamiento y refactorización cuidadosa puedo conseguir que hasta ~ 12fps si no me importa demasiado acerca de hacer cualquier otra cosa!

Mi pregunta es: ¿cómo consiguió un dispositivo como la GBA (Game Boy Advance) una tasa de fotogramas de casi 60 fps? Pensé en tener un "procesador gráfico" separado, pero me di cuenta de que seguiría siendo un cuello de botella al transferir los datos de la pantalla a eso.

También me he planteado utilizar la vestigial interfaz paralela de 8 bits que suelen tener la mayoría de estas pantallas, lo que podría suponer un aumento de velocidad de 8 veces, pero los MCUs modernos no suelen tener interfaces paralelas de hardware como las de serie, y los golpes de bits probablemente se llevarán gran parte de la ganancia de velocidad.

¿Qué otras opciones existen?

Actualmente estoy usando un ATmega1284P conectado a un controlador OLED SSD1306 vía USART-SPI. Es la versión monocromática.

La pantalla en color era un SSD1351, no conectado originalmente al hardware SPI. No estaba convencido de que hiciera suficiente diferencia, es demasiado lento en general

Sé que puedo conseguir MCUs más rápidos, pero quiero saber qué otras opciones podría explorar - ¡el procesador de GBA es mucho más lento que mi 1284!

7 votos

"Seguiría siendo un cuello de botella transferir los datos de la pantalla a eso". La DSI tiene cuatro carriles de hasta 1,2 Gbits/seg. El resto de los cálculos te los dejo a ti.

0 votos

"Seguiría siendo un cuello de botella transferir los datos de la pantalla a eso". ¿Quiere decir que cree que se produciría un cuello de botella al transferir datos al procesador gráfico, o del procesador gráfico a la pantalla?

1 votos

Al igual que los gráficos en cualquier dispositivo de videojuegos, hay una memoria que se encargaría de los gráficos. Según este sitio web, hay una ubicación de la dirección para los gráficos, el sonido, etc. Las instrucciones se almacenarían allí. Asumiendo que no hay muchos datos que crearían conflictos con el tiempo de rendimiento, ejecutaría esas instrucciones para cargar los datos gráficos con facilidad.

65voto

Terence Simpson Puntos 976

Otras respuestas cubren bastante bien tu pregunta a nivel abstracto (hardware), pero al tener experiencia real con la GBA en particular me imaginé que una explicación más detallada podría valer la pena.

La GBA tenía muchos modos de dibujo y ajustes que podían utilizarse para controlar la forma en que el procesador gráfico interpretaba la RAM de vídeo, pero una cosa era ineludible: la velocidad de los fotogramas. El procesador gráfico dibujaba en la pantalla en un bucle casi (más adelante) constante. (Esta es probablemente la parte más relevante para su pregunta).

Dibujaría una línea a la vez tomando un breve descanso entre cada una. Después de dibujar la última línea para el marco, se tomaría un descanso aproximadamente igual al tiempo que se tarda en dibujar 30 líneas. Y luego vuelve a empezar. El tiempo de cada línea y el tiempo de cada cuadro estaban predeterminados y grabados en piedra. En muchos sentidos, el procesador gráfico era realmente el maestro de ese sistema y había que escribir los juegos en torno a su comportamiento, porque seguiría haciendo lo que hacía tanto si estabas preparado como si no.

Aproximadamente el 75-80% del tiempo estaba empujando activamente a la pantalla. ¿Qué tasas de fotogramas podrías conseguir si hicieras lo mismo?

Ese 80% del tiempo era también el que tenía la CPU para procesar la entrada del usuario, calcular el estado del juego y cargar los sprites/tiles en zonas de la VRAM que en ese momento estaban fuera de la pantalla (o al menos no estaban incluidos en la línea que se estaba dibujando).

El 20% entre fotogramas, era todo lo que tenía la CPU para ajustar la configuración de vídeo o la memoria RAM que repercutiría en todo el siguiente fotograma.

Al final de cada línea, el procesador gráfico enviaba una interrupción de sincronización de línea a la CPU. Esta interrupción podría usarse para ajustar la configuración de unos cuantos sprites, o unas cuantas capas de fondo (así es como se puede conseguir un efecto como un foco cónico, cambiando el tamaño y la ubicación de una de las máscaras rectangulares entre cada línea dibujada. En lo que respecta al hardware, todas esas regiones son rectangulares). Hay que tener cuidado de que estas actualizaciones sean pequeñas y terminen antes de que el procesador gráfico comience a dibujar la siguiente línea o se pueden obtener resultados feos. Cualquier tiempo dedicado a procesar estas interrupciones también recorta ese 80% del tiempo de procesamiento de la CPU...

En los juegos que sacaban el máximo partido a este sistema, ni la CPU ni el procesador gráfico se tomaban un verdadero descanso; cada uno perseguía al otro por el bucle actualizando lo que el otro no estaba mirando en ese momento.

6 votos

Bienvenido y bien dicho.

3 votos

Algunas consolas "más nuevas", como la Nintendo DS, han sorteado la limitación de la velocidad de fotogramas fija añadiendo el registro VCOUNT para retrasar el siguiente fotograma durante una cantidad de tiempo configurable (normalmente para ayudar a sincronizar las partidas multijugador).

22voto

jns Puntos 449

La característica clave de todas las videoconsolas que las distinguía de los primeros PC y de prácticamente todos los ordenadores domésticos(1) era sprites de hardware .

La guía de programación de GBA enlazada muestra cómo funcionan desde el punto de vista del procesador principal. Los mapas de bits que representan al jugador, el fondo, los enemigos, etc., se cargan en un área de memoria. Otra área de memoria especifica la ubicación de los sprites. Así, en lugar de tener que reescribir toda la memoria RAM de vídeo en cada fotograma, lo que requiere un montón de instrucciones, el procesador sólo tiene que actualizar la ubicación de los sprites.

El procesador de vídeo puede entonces trabajar píxel a píxel para determinar qué sprite dibujar en ese punto.

Sin embargo, esto requiere una RAM de doble puerto compartida entre los dos, y creo que en la GBA el procesador de vídeo está en el mismo chip que el ARM principal y el procesador Z80 secundario.

(1) Excepción notable: Amiga

0 votos

Sólo un detalle: los primeros juegos arcade tenían los sprites en una ROM asociada al procesador gráfico, no en una RAM de doble puerto. No tengo ni idea de si ese era también el caso de las primeras consolas, aunque ciertamente podría haberse hecho así.

0 votos

@TimWescott la GBA tenía múltiples modos de dibujo y no tengo experiencia con la mayoría así que esto puede no ser universalmente cierto pero, no creo que ninguno de esos modos tuviera acceso directo a las ROMs(en cartucho): Normalmente todos los datos de las baldosas/espitas/paletas tenían que ser transferidos de la ROM a la memoria de vídeo y el procesador gráfico trabajaba en ella desde allí.

0 votos

@Mr.Mindor Perdona si no he sido claro -- no pretendo saber cómo lo hicieron la GB o la GBA. Sólo estaba comentando los primeros juegos arcade de Nintendo de finales de los 70 y principios de los 80, que nos hacían preguntarnos cómo demonios lo hacían. hizo eso.

19voto

TimWescott Puntos 261

"Mi pregunta es: ¿cómo consiguió un dispositivo como la GBA una tasa de fotogramas de casi 60 fps?"

Para responder sólo a la pregunta, lo hicieron con un procesador gráfico. Estoy bastante seguro de que la Game Boy utilizaba gráficos de sprites. En un nivel superior, eso significa que el procesador de gráficos se carga cosas como una imagen de un fondo, y una imagen de Mario, y una imagen de la princesa Peach, etc. Entonces el procesador principal emite órdenes como "mostrar el fondo desplazado esta cantidad en x e y, superponer la imagen de Mario #3 en esta posición x, y", etc. Así que el procesador principal no se preocupa en absoluto de dibujar cada píxel, y el procesador gráfico no se preocupa en absoluto de calcular el estado del juego. Cada uno está optimizado para lo que tiene que hacer, y el resultado es un videojuego bastante bueno sin utilizar mucha potencia de cálculo.

7 votos

Llamarle "procesador gráfico" exagera lo que hace, sugiriendo que es una especie de CPU propia. Es sólo un controlador de vídeo, que es básicamente una especie de secuenciador complicado. Mientras cuenta los píxeles horizontales y verticales, obtiene los datos del título y/o del sprite, los pone en registros de desplazamiento y combina la salida de los registros de desplazamiento en un píxel de salida. No es capaz de ejecutar un programa como un verdadero procesador gráfico "GPU".

15voto

La GBA tenía un procesador bastante lento. El ARM7 es muy bueno; simplemente lo hicieron funcionar lentamente y no le dieron casi ningún recurso.

Hay una razón por la que muchos juegos de Nintendo en ese momento y antes eran de desplazamiento lateral. HARDWARE. Todo se hacía en hardware. Tenías múltiples capas de fichas más uno o más sprites y el hardware hacía todo el trabajo para extraer los píxeles de esas tablas y manejar la pantalla.

Construyes el conjunto de baldosas por adelantado y luego tienes una pequeña memoria que es un mapa de baldosas. ¿Quieres que la baldosa inferior izquierda sea la baldosa 7? Pones un 7 en esa posición de memoria. ¿Quieres que la siguiente baldosa sea la 19? En el conjunto de azulejos, pones un 19 allí, y así sucesivamente para cada capa que hayas habilitado. Para el sprite, sólo tienes que establecer la dirección x/y. También puedes hacer el escalado y la rotación configurando algunos registros y el hardware se encarga del resto.

El modo 7, si no recuerdo mal, era un modo de píxeles, pero era como una tarjeta de vídeo tradicional en la que metes bytes que cubren el color de un píxel y el hardware se encarga del refresco del vídeo. Creo que podías hacer ping pong o al menos cuando tenías un nuevo fotograma podías voltearlos, pero no recuerdo bien. De nuevo, el procesador estaba bastante underclocked para esa época y no tenía demasiados recursos rápidos. Así que mientras algunos juegos eran modo 7, muchos eran side-scrollers basados en baldosas...

Si quieres una solución que tenga una alta tasa de fotogramas, tienes que diseñar esa solución. No puedes tomar cualquier pantalla vieja que encuentres y hablar con ella vía SPI o I²C o algo así. Poner al menos un framebuffer delante, idealmente dos, y tener control de filas y columnas si es posible sobre esa pantalla.

Varias de las pantallas que sospecho que estás comprando tienen un controlador con el que realmente estás hablando. Si quieres un rendimiento tipo GBA/consola, crea/implementa el controlador. O compras/construyes con una GPU/chip de vídeo/bloque lógico, y utilizas HDMI u otra interfaz común en un monitor de serie.

El hecho de que una bicicleta tenga neumáticos, cadena y marchas no significa que pueda ir tan rápido como una moto. Hay que diseñar el sistema para que satisfaga sus necesidades de rendimiento, de punta a punta. Puedes poner esa rueda de bicicleta en esa moto, pero no tendrá el rendimiento deseado; todos los componentes tienen que formar parte del diseño global.

Asteroides también funcionaba así; sólo necesitaba un 6502. Los gráficos vectoriales se hacían con una lógica separada; el 6502 enviaba una pequeña cadena de datos al controlador de gráficos vectoriales, que utilizaba una ROM y esos datos para hacer el trazado xy del rayo y z, on/off... Algunos standups tenían procesadores separados para manejar el audio y el video por separado del procesador que calculaba el juego. Por supuesto, hoy en día el vídeo es manejado por algunos cientos, si no miles, de procesadores que están separados del procesador principal...

0 votos

Juro que recuerdo que mode7 fue metido con calzador por el marketing como respuesta al "hyper mode" de Sega o algo así... ¿tal vez "Super FX"? es.wikipedia.org/wiki/Modo_7

0 votos

coranac.com/tonc/text/bitmaps.htm#sec-modes Puede que lo recuerde mal, estoy pensando en el modo 5, o uno de los modos de mapa de bits, hay algunos modos de azulejos con sprites y modo o modos de mapa de bits / buffer de marco.

0 votos

hmm leyendo más sobre el modo 7 y no es sólo un modo. De todos modos la GBA tiene modos de mosaico y modos de mapa de bits que son más lentos ya que tienes que ser responsable de cada píxel donde los modos de mosaico un byte en el mapa de mosaico produce muchos píxeles. También aprovecharon el tamaño de los buses (anchura) y la velocidad de la memoria, y una cosa de caché de tubería de rom para ayudar a conseguir cosas (instrucciones) de la rom un poco más rápido. Pero desde el primer día se luchaba por conseguir que el software se ejecutara a una velocidad decente y, afortunadamente, la lógica se encargaba de la mayor parte del trabajo de vídeo.

7voto

ShaneB Puntos 1384

¿cómo pudo un dispositivo como la GBA alcanzar una tasa de fotogramas de casi 60 fps?

Hardware.

Tiene memoria gráfica, que puede o no compartir el mismo bus que la memoria de programa/datos... pero lo importante es que tiene un procesador gráfico que lee la memoria 60 veces por segundo y envía los datos a la pantalla LCD utilizando una interfaz optimizada que está diseñada para hacerlo de forma eficiente.

Puedes hacer lo mismo con cualquier microcontrolador moderno equipado con un periférico de "interfaz LCD", por ejemplo el LPC4330 aunque esto podría ser demasiado. Por supuesto, necesitarás un panel LCD compatible.

Con los microcontroladores rápidos modernos (es decir, ARM no AVR) y una pantalla tan pequeña, probablemente no necesitarás sprites o un blitter para acelerar las operaciones gráficas. Con un AVR de 8 bits podría ser lento.

Pero no importa la cpu, golpear con bits la interfaz de la pantalla va a ser una mierda.

Creo que la Atari 2600 utilizaba el golpeo de bits de la CPU para enviar la imagen al televisor. Eso es un poco obsoleto.

0 votos

Incluso la 2600 tenía sprites por hardware, aunque un número muy limitado (dos jugadores y dos balas creo)

2 votos

@pjc50, el Atari 2600 algo así como tenía sprites de hardware. Como cualquier otra parte del subsistema gráfico, eran objetos unidimensionales. Si el programador quería algo más que un conjunto de líneas verticales, el programa tenía que actualizar los sprites después de dibujar cada fila en la pantalla.

1 votos

@Mark: La 2600 definitivamente tenía sprites por hardware. El hardware sólo controlaba el posicionamiento horizontal, pero los sprites de la 2600 hicieron posible que los juegos fueran mucho más coloridos que cualquiera de sus competidores.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X