Wie erreichen Geräte wie der Game Boy Advance ihre Bildrate?

31

Ich habe mein eigenes Handspielgerät entwickelt, das auf einem AVR-Mikrocontroller und einem kleinen OLED-Display basiert.

Ich habe mit einem monochromen Display mit 128 x 64 Pixeln begonnen und kann bequem mit über 60 Bildern pro Sekunde darauf zeichnen.

Ich habe es kürzlich überarbeitet, um eine RGB-OLED mit 128 x 128 Pixeln zu verwenden, ohne wirklich zu viel darüber nachzudenken, nur um festzustellen, dass ich nur etwa 4 FPS erreichen konnte. Nach einigem Überlegen und sorgfältigem Refactoring kann ich das auf ~ 12fps bringen, wenn es mir nicht so wichtig ist, etwas anderes zu tun!

Meine Frage ist - wie hat ein Gerät wie der GBA (Game Boy Advance) eine Bildrate von fast 60 fps erreicht? Ich dachte über einen separaten Grafikprozessor nach, erkannte aber, dass ich immer noch einen Engpass haben würde, wenn ich die Anzeigedaten dorthin übertrage.

Ich habe mich auch gefragt, ob ich die ursprüngliche 8-Bit-Parallelschnittstelle verwenden soll, die die meisten dieser Bildschirme haben, was mir eine 8-fache Geschwindigkeit einbringt, mit der Ausnahme, dass moderne MCUs keine Hardware-Parallelschnittstellen haben, wie sie es für serielle und bitbasierte Schnittstellen tun. Schlagen wird wahrscheinlich einen großen Teil des Geschwindigkeitsgewinns verschlingen.

Welche anderen Möglichkeiten gibt es?

Ich verwende derzeit einen ATmega1284P, der über USART-SPI an einen SSD1306-OLED-Controller angeschlossen ist. Das ist die monochrome Version.

Der Farbbildschirm war eine SSD1351, die ursprünglich nicht mit Hardware-SPI verbunden war. Ich war nicht überzeugt, dass es genug bringen würde Unterschied , es ist insgesamt einfach zu langsam

Ich weiß, dass ich schnellere MCUs bekommen kann, aber ich möchte wissen, welche anderen Optionen ich untersuchen könnte - der GBA-Prozessor ist viel langsamer als mein 1284!

MalphasWats
quelle
6
"Ich hätte immer noch einen Engpass, wenn ich die Anzeigedaten dorthin übertragen würde." DSI verfügt über vier Spuren mit jeweils bis zu 1,2 Gbit / s. Den Rest der Berechnungen überlasse ich Ihnen.
Oldfart
1
Genau wie bei jeder Grafik in einem Videospielgerät gibt es einen Speicher, der Grafiken verarbeiten kann. Laut dieser Website gibt es einen Adressspeicherort für Grafiken, Sound usw. Anweisungen würden dort gespeichert. Angenommen, es gibt nicht viele Daten, die zu Konflikten mit der Leistungszeit führen würden, würden diese Anweisungen ausgeführt, um die grafischen Daten mühelos zu laden.
KingDuken
5
Kaufen Sie das Display ohne Controller und stellen Sie Ihren eigenen Controller her
old_timer
4
@immibis: Mit ziemlicher Sicherheit ein schrecklicher I2C- oder SPI-basierter Controller. Hobbyistisches Zeug ist voll von überteuerten langsamen Sachen, wenn man wegen Skaleneffekten einen verdammten iPhone-Bildschirm mit über 400 dpi für 20 US-Dollar bekommt.
R ..
6
@R .. Ich möchte nur darauf hinweisen, dass der Grund für diese Hobby-Controller ist, dass sie an fast jeden Prozessor angeschlossen werden können, da Sie den Eindruck erwecken, dass sie unbrauchbar sind. Sie könnten, wenn überhaupt, keine einfache Schnittstelle zu einem iPhone-Bildschirm herstellen. Es wird wahrscheinlich eine Verbindung zu einem dedizierten und möglicherweise benutzerdefinierten Grafikprozessor hergestellt.
user253751

Antworten:

64

Andere Antworten decken Ihre Frage auf abstrakter Ebene (Hardware) ziemlich gut ab, aber ich war der Meinung, dass es sich lohnen könnte, eine detailliertere Erklärung zu geben, wenn ich über konkrete Erfahrungen mit der GBA verfüge.

Der GBA verfügte über zahlreiche Zeichenmodi und -einstellungen, mit denen gesteuert werden konnte, wie der Grafikprozessor den Video-RAM interpretierte. Eines war jedoch unausweichlich: die Bildrate. Der Grafikprozessor zeichnete in einer fast (mehr dazu weiter unten) konstanten Schleife auf den Bildschirm. (Dies ist wahrscheinlich das relevanteste Bit für Ihre Frage.)

Es würde eine Linie nach der anderen ziehen und eine sehr kurze Pause zwischen den beiden einlegen. Nach dem Zeichnen der letzten Linie für den Rahmen würde eine Pause erforderlich sein, die in etwa der Zeit entspricht, die zum Zeichnen von 30 Linien benötigt wird. Dann wieder von vorne anfangen. Das Timing jeder Zeile und das Timing jedes Rahmens waren alle vorbestimmt und in Stein gemeißelt. In vielerlei Hinsicht war der Grafikprozessor wirklich der Meister dieses Systems, und Sie mussten Ihre Spiele um sein Verhalten herum schreiben, da er weiterhin das tat, was er tat, unabhängig davon, ob Sie bereit waren oder nicht.

Ungefähr 75-80% der Zeit wurde aktiv auf den Bildschirm gedrückt. Welche Frameraten könnten Sie erreichen, wenn Sie dasselbe tun?

In 80% der Zeit musste die CPU auch Benutzereingaben verarbeiten, den Spielstatus berechnen und Sprites / Kacheln in Bereiche des VRAM laden, die sich derzeit außerhalb des Bildschirms befanden (oder zumindest nicht in der aktuell gezeichneten Linie enthalten waren).

Die 20% zwischen den Frames waren alles, was die CPU für die Optimierung der Videoeinstellungen oder des RAM-Speichers benötigte, um den gesamten nächsten Frame zu beeinflussen.

Am Ende jeder Zeile würde der Grafikprozessor einen Zeilensynchronisations-Interrupt an die CPU senden. Dieser Interrupt kann verwendet werden, um Einstellungen für einige Sprites oder einige Hintergrundebenen zu optimieren (auf diese Weise können Sie einen Effekt wie bei einem konischen Scheinwerfer erzielen, indem Sie die Größe und Position einer der rechteckigen Masken zwischen den einzelnen Linien ändern In Bezug auf die Hardware sind alle diese Bereiche rechteckig.). Sie müssen vorsichtig sein, um diese Updates klein zu halten und fertig zu stellen, bevor der Grafikprozessor mit dem Zeichnen der nächsten Zeile beginnt. Andernfalls können hässliche Ergebnisse erzielt werden. Jeder Zeitaufwand für die Verarbeitung dieser Interrupts verkürzt auch die Verarbeitungszeit der CPU um 80%.

Bei Spielen, die das meiste aus diesem System herausholen, haben weder die CPU noch der Grafikprozessor jemals eine Pause eingelegt. jeder jagte den anderen um die Schleife und aktualisierte, was der andere gerade nicht ansah.

Mr.Mindor
quelle
5
Willkommen und gut gesagt.
Mindwin
2
Einige "neuere" Systeme wie der Nintendo DS haben die festgelegte Frameratenbeschränkung umgangen, indem sie das VCOUNT-Register hinzugefügt haben, um den nächsten Frame um eine konfigurierbare Zeitspanne zu verzögern (normalerweise, um die Synchronisierung von Multiplayer-Spielen zu erleichtern).
Wald
21

Das Hauptmerkmal aller Spielekonsolen, die sie von früheren PCs und praktisch allen Heimcomputern unterschieden (1), waren Hardware-Sprites .

Der verknüpfte GBA-Programmierleitfaden zeigt, wie sie aus Sicht des Hauptprozessors funktionieren. Bitmaps, die Spieler, Hintergrund, Gegner usw. darstellen, werden in einen Speicherbereich geladen. Ein anderer Speicherbereich gibt die Position der Sprites an. Anstatt den gesamten Video-RAM für jeden Frame neu schreiben zu müssen, was viele Anweisungen erfordert, muss der Prozessor nur die Position der Sprites aktualisieren.

Der Videoprozessor kann dann pixelweise arbeiten, um zu bestimmen, welches Sprite an diesem Punkt gezeichnet werden soll.

Dies erfordert jedoch einen Dual-Port-RAM, der von beiden gemeinsam genutzt wird, und ich denke, dass sich der Videoprozessor im GBA auf demselben Chip befindet wie der Haupt-ARM- und der sekundäre Z80-Prozessor.

(1) Bemerkenswerte Ausnahme: Amiga

pjc50
quelle
Nur eine Kleinigkeit - bei den wirklich frühen Arcade-Spielen befanden sich die Sprites in einem ROM, das dem Grafikprozessor zugeordnet war, und nicht in einem Dual-Port-RAM. Ich habe keine Ahnung, ob dies auch bei den frühen Konsolen der Fall war, obwohl dies sicherlich auch so möglich gewesen wäre.
TimWescott
@ TimWescott die GBA hatte mehrere Zeichenmodi und ich habe keine Erfahrung mit den meisten, so dass dies möglicherweise nicht allgemein zutreffend ist, aber ich glaube, keiner dieser Modi hatte direkten Zugriff auf die ROMs (auf Kassette): In der Regel alle Kachel- / Sprite- / Palettendaten mussten vom ROM in den Videospeicher übertragen und von dort aus vom Grafikprozessor bearbeitet werden.
Mr.Mindor
@ Mr.Mindor Entschuldigung, wenn ich nicht klar wäre - ich gebe nicht vor zu wissen, wie GB oder GBA es getan haben. Ich kommentierte nur auf die wirklich früh Nintendo Arcade - Spiele zurück in den späten 70er und 80er Jahren früh, dass alle von uns hatte sich fragen , wie in h *** sie taten das.
TimWescott
@ TimWescott: Ich denke, dasselbe galt für das NES, obwohl sich das fragliche ROM in den Game Paks befand.
Supercat
19

"Meine Frage ist - wie hat ein Gerät wie der GBA eine Bildrate von fast 60 fps erreicht?"

Um nur die Frage zu beantworten, haben sie es mit einem Grafikprozessor gemacht. Ich bin mir ziemlich sicher, dass der Game Boy Sprite-Grafiken verwendet hat. Auf der obersten Ebene bedeutet dies, dass der Grafikprozessor Dinge wie ein Bild eines Hintergrunds und ein Bild von Mario und ein Bild von Prinzessin Peach usw. lädt. Dann gibt der Hauptprozessor Befehle aus, wie "Hintergrundversatz dadurch anzeigen" Englisch: www.mjfriendship.de/en/index.php?op...37&Itemid=32 Viel in x und y überlagern Sie Mario - Bild 3 an dieser x, y - Position ", usw. Der Hauptprozessor befasst sich also absolut nicht mit dem Zeichnen jedes Pixels, und der Grafikprozessor befasst sich absolut nicht mit dem Berechnen des Zustands von Spiel. Jedes ist für das optimiert, was es tun muss, und das Ergebnis ist ein ziemlich gutes Videospiel ohne viel Rechenleistung.

TimWescott
quelle
7
Die Bezeichnung "Grafikprozessor" übertreibt die Funktionsweise und legt nahe, dass es sich um eine eigene CPU handelt. Es ist nur ein Videocontroller, der im Grunde eine komplizierte Art von Sequenzer ist. Wenn horizontale und vertikale Pixel hochgezählt werden, werden Titel- und / oder Sprite-Daten abgerufen, in Schieberegister abgelegt und die Ausgabe der Schieberegister zu einem Ausgabepixel kombiniert. Es ist nicht in der Lage, ein Programm wie einen tatsächlichen "GPU" -Grafikprozessor auszuführen.
Ross Ridge
14

Der GBA hatte einen ziemlich langsamen Prozessor. Der ARM7 ist sehr schön; Sie liefen es nur langsam und gaben es so gut wie keine Ressourcen.

Es gibt einen Grund, warum viele Nintendo-Spiele zu diesem Zeitpunkt und früher Side-Scroller waren. HARDWARE. Es ist alles in Hardware erledigt. Sie hatten mehrere Kachelebenen plus ein oder mehrere Sprites, und die Hardware hat alles getan, um Pixel aus diesen Tabellen zu extrahieren und die Anzeige zu steuern.

Sie bauten die Kacheln vorne auf und hatten dann ein kleines Gedächtnis, das eine Kachelkarte war. Soll die untere linke Kachel Kachel 7 sein? Sie setzen eine 7 in diesen Speicherort. Soll die nächste Kachel die Kachel 19 sein? Im Kachelsatz setzen Sie dort eine 19 und so weiter für jede Ebene, die Sie aktiviert haben. Für das Sprite legen Sie einfach die x / y-Adresse fest. Sie können auch skalieren und drehen, indem Sie einige Register setzen. Den Rest erledigt die Hardware.

Wenn ich mich recht erinnere, war Modus 7 ein Pixelmodus, aber das war wie bei einer herkömmlichen Grafikkarte, bei der Sie Bytes in die Farbe eines Pixels einfügen und die Hardware die Aktualisierung des Videos übernimmt. Ich denke, du könntest Ping-Pong spielen oder wenn du einen neuen Rahmen hättest, könntest du sie umdrehen, aber ich erinnere mich nicht richtig. Auch hier war der Prozessor für diesen Tag und dieses Alter ziemlich übertaktet und verfügte nicht über zu viele schnelle Ressourcen. Während einige Spiele Mode 7 waren, waren viele Side-Scroller auf Kachelbasis ...

Wenn Sie eine Lösung mit hoher Bildrate wünschen, müssen Sie diese Lösung entwerfen. Sie können nicht einfach ein altes Display nehmen und über SPI oder I²C oder ähnliches damit sprechen. Stellen Sie mindestens einen Framebuffer davor, idealerweise zwei, und steuern Sie Zeilen und Spalten, wenn möglich, über diese Anzeige.

Ich vermute, dass einige der Displays, die Sie kaufen, über einen Controller verfügen, mit dem Sie tatsächlich sprechen. Wenn Sie eine Leistung vom Typ GBA / Konsole wünschen, erstellen / implementieren Sie den Controller. Oder Sie kaufen / bauen mit einer GPU / einem Videochip / einem Logik-Blob und verwenden HDMI oder eine andere gemeinsame Schnittstelle für einen Lagermonitor.

Nur weil ein Fahrrad Reifen und eine Kette und Zahnräder hat, kann es nicht so schnell fahren wie ein Motorrad. Sie müssen das System so gestalten, dass es Ihre Leistungsanforderungen von Ende zu Ende erfüllt. Sie können das Fahrradrad auf das Motorrad setzen, aber es funktioniert nicht wie gewünscht. Alle Komponenten müssen Teil des Gesamtdesigns sein.

Asteroiden arbeiteten auch so; es wurde nur ein 6502 benötigt. Die Vektorgrafiken wurden mit separater Logik erstellt; Der 6502 hat eine winzige Datenfolge an den Vektorgrafik-Controller gesendet, der ein ROM und diese Daten für das xy-Zeichnen des Strahls und des zs verwendet hat. Ein / Aus ... Einige Stand-ups hatten separate Prozessoren, um Audio und Video getrennt zu verarbeiten der Prozessor, der das Spiel berechnet. Natürlich wird das Video heute von einigen Hundert, wenn nicht Tausenden von Prozessoren verarbeitet, die vom Hauptprozessor getrennt sind ...

Oldtimer
quelle
Ich schwöre, ich erinnere mich, dass Mode7 durch Marketing als Antwort auf Segas "Hypermodus" oder so etwas beschlagen wurde ... vielleicht "Super FX?" en.wikipedia.org/wiki/Mode_7
Caleb Jay
coranac.com/tonc/text/bitmaps.htm#sec-modes Ich habe mich vielleicht an etwas Falsches erinnert. Ich denke an Modus 5 oder einen der Bitmap-Modi. Es gibt einige Kachelmodi mit Sprites und Bitmap / Framebuffer-Modus oder Modi . Vielleicht gibt es eine 7., von der Sie nichts wussten, aber das ist gut zu wissen.
old_timer
Hmm, lesen Sie mehr über Modus 7 und es ist nicht nur ein Modus. Auf jeden Fall verfügt der GBA über Kachel- und Bitmap-Modi, die langsamer sind, da Sie für jedes Pixel verantwortlich sein müssen, bei dem die Kachelmodi eines Bytes in der Kachel-Map viele Pixel erzeugen. Sie nutzten auch die Größe der Busse (Breite) und die Geschwindigkeit des Speichers sowie einen ROM-Pipeline-Cache, um die Daten (Anweisungen) ein wenig schneller aus dem ROM zu holen. Aber vom ersten Tag an hatten Sie Mühe, Software mit einer angemessenen Geschwindigkeit zum Laufen zu bringen, und zum Glück hat die Logik den größten Teil der Videoarbeit erledigt.
old_timer
Wenn Sie sich diese Displays ansehen, die Sie kaufen und die über diese parallelen 8-Bit- oder 4-Bit- oder SPI- oder I2C-Schnittstellen verfügen, die Ihrer Leistung im Wege stehen, möchten Sie das unformatierte Display ohne diese Controller und können dann steuern, wie das Display verwaltet wird Erstellen Sie einen oder zwei Framebuffer, damit Sie Ping / Pong und eine schnelle Schnittstelle von Ihrer CPU zum Framebuffer verwenden können. vorausgesetzt, Sie beginnen zunächst mit einer ausreichend schnellen Anzeige.
old_timer
7

Wie hat ein Gerät wie der GBA eine Bildrate von fast 60 fps erreicht?

Hardware.

Es verfügt über einen Grafikspeicher, der möglicherweise den gleichen Bus wie der Programm- / Datenspeicher verwendet oder nicht. Wichtig ist jedoch, dass er über einen Grafikprozessor verfügt, der den Speicher 60 Mal pro Sekunde liest und die Daten mithilfe von an auf das LCD sendet optimierte Schnittstelle, die dafür effizient ausgelegt ist.

Dasselbe können Sie mit jedem modernen Mikrocontroller tun, der mit einem "LCD-Interface" -Peripheriegerät ausgestattet ist, z. B. dem LPC4330, obwohl dies viel zu viel sein kann. Natürlich benötigen Sie ein kompatibles LCD-Panel.

Mit modernen schnellen Mikrocontrollern (z. B. ARM, nicht AVR) und einem so kleinen Bildschirm werden Sie wahrscheinlich keine Sprites oder Blitter benötigen, um Grafikoperationen zu beschleunigen. Mit einem 8-Bit-AVR kann es langsam sein.

Aber egal wie hoch die CPU-Leistung ist, ein bisschen hämmert die Schnittstelle zum Display.

Ich glaube, der Atari 2600 verwendete CPU-Bit-Banging, um das Bild an den Fernseher zu senden. Das ist ein bisschen veraltet.

peufeu
quelle
Sogar der 2600 hatte Hardware-Sprites, obwohl eine sehr begrenzte Anzahl (zwei Spieler und zwei Kugeln, glaube ich)
pjc50
2
@ pjc50, die Atari 2600 Art hatte Hardware-Sprites. Wie jeder andere Teil des Grafiksubsystems waren sie eindimensionale Objekte. Wenn der Programmierer etwas anderes als eine Reihe vertikaler Linien haben wollte, musste das Programm die Sprites aktualisieren, nachdem jede Zeile auf dem Bildschirm angezeigt wurde.
Mark
1
@Mark: Der 2600 hatte definitiv Hardware-Sprites. Die Hardware steuerte nur die horizontale Positionierung, aber die Sprites des 2600 ermöglichten es Spielen, Spiele zu produzieren, die weitaus bunter waren als die der Konkurrenz.
Supercat