Die Geschichte der unmöglichen Portierung: Wie Quake auf den Game Boy Advance portiert wurde

Quake auf den Game Boy Advance zu portieren schien unmöglich gewesen zu sein, aber Randy Linden hat es geschafft. Hier ist wie.

Der Game Boy Advance ist eine von Nintendo entwickelte Handheld-Spielekonsole. Es erschien 2001 in Japan und diente als Nachfolger des Game Boy Color. Es verfügte über einen mit 16,78 MHz getakteten ARM7TDMI, 32 KB internen Arbeits-RAM, 256 KB externen RAM und 96 KB VRAM. Es ist nicht das leistungsstärkste Gerät, aber es gibt viele Spiele für den Handheld, die vielen in guter Erinnerung bleiben. Ein Spiel, das für das Gerät jedoch nie das Licht der Welt erblickte, war eine Prototyp-Portierung von Quake, einem von id Software entwickelten Spiel, das dazu beitrug, das Ego-Shooter-Genre zu definieren, das wir heute kennen.

Quake ist ein unglaublich detailliertes Spiel mit einem fantastischen Soundtrack und fesselndem Gameplay und wurde genau wie DOOM auf praktisch jedes erdenkliche Gerät portiert. Seine Portierung auf den Game Boy Advance ist besonders beeindruckend, da er keine native 3D-Grafik unterstützt und Nintendo den Handheld ausdrücklich als zweidimensionales Spielerlebnis vermarktet hat. Das hielt Randy Linden jedoch nicht davon ab, seinen eigenen Port zu entwickeln.

Foto der Quake-Portierung, abgespielt auf einem Analogue Pocket, verwendet mit Genehmigung von Modern Vintage Gamer

Wenn Sie Linden nicht kennen: Er ist vor allem als Entwickler beider Bleem bekannt! (ein PlayStation-Emulator) und die SNES-Portierung von DOOM, eine Errungenschaft, die John Romero, Mitbegründer von id Software, einmal in einem Interview mit sagte Shacknews er hielt es nicht für möglich. Lindens Entwicklungskompetenz bewies, dass jemand, der Quake auf dem Game Boy Advance Wirklichkeit werden lassen konnte, wahrscheinlich er war.

Dieser Port wurde dank Lindens eigener Veröffentlichung im Rahmen des Forest of Illusion-Projekts ans Licht gebracht. Forest of Illusion ist ein Projekt, das darauf abzielt, die Geschichte der Nintendo-Spiele und von Linden zu bewahren kontaktierte ihn, um die Kopie des Quake-Ports, den er auf einer 256-MB-Flash-Karte in seinem gefunden hatte, zu verteilen Besitz.

Wir möchten Randy Linden dafür danken, dass er sich die Zeit genommen hat, unsere Fragen zu beantworten und die technische Richtigkeit dieses Artikels sicherzustellen. Wir möchten uns auch bedanken Moderner Vintage-Gamer dafür, dass wir alle benötigten Standbilder aus seinem Video verwenden durften. Dieser Port hat keine offizielle Beziehung zu id Software oder ZeniMax und wurde als Soloprojekt von Linden entwickelt.

Quakes Game Boy Advance-Portierung

Technisch gesehen ist es ein Wunder, dass Quake überhaupt das gleiche Niveau erreichen kann wie auf dem Game Boy Advance. Es läuft mit einer guten Bildrate und behält die korrekte Beleuchtung und Farbpalette des ursprünglichen Quake-Spiels bei. Alles ist 3D, einschließlich Waffen und Monster. Spiele auf dem Game Boy Advance erreichten 3D-Grafiken normalerweise durch Sprites, aber das war das einzig Wahre. Es nutzt Raycasting nicht wie andere 3D-Spiele auf dem Handheld und erreicht sogar seinen Zweck Lichteffekte auf vorgerenderten Objekten mithilfe eines Palettenwechsel-Tricks, um eine Illusion von Dynamik zu erzielen Beleuchtung.

Um es klarzustellen: Bei dieser Portierung handelt es sich nicht um das vollständige Spiel, sondern um einen Prototyp, den Linden nach seiner Fertigstellung zur Veröffentlichung an id Software weitergeben wollte. Die Popularität des Game Boy Advance begann jedoch zu schwinden, und stattdessen wurde die von Linden geschriebene benutzerdefinierte Engine später zur Engine eines anderen, vollständig von Linden entwickelten Spiels – Cyboid. Linden sagt uns, dass ein „großer Teil des Codes“ immer noch der ursprüngliche ARM-Code aus der Game Boy Advance-Version ist. Wenn Sie Cyboid ausprobieren möchten, ist eine ältere Version im Google Play Store verfügbar, die offizielle APK wird jedoch jetzt über den verteilt Amazon App Store da das Spiel viel Low-Level-32-Bit-Code hat.

CyboidEntwickler: R und R Digital, LLC.

Kostenlos.

3.3.

Herunterladen

Linden teilte uns auch ein Video seines Codes mit, der auf dem iPod Video läuft, einer der frühesten Versionen von Cyboid. Es basierte auf dem gleichen Engine-Code, der auch für seine Quake-Portierung auf den Game Boy Advance verwendet wurde.

Die Game Boy Advance-Portierung von Quake enthält im Gegensatz zu Linden keine der offiziellen Assets des Spiels Ich habe entweder id Software oder ZeniMax kontaktiert, um die E1M1-Version zu vertreiben, die das offizielle Quake enthält Vermögenswerte.

Das derzeit verteilte Spiel ist ebenfalls ein Debug-Build. Das Halten der R-Taste beim Hochfahren bringt den Spieler direkt zur zweiten Karte des Spiels, und wenn er die linke Maustaste auf dem D-Pad gedrückt hält, gelangt er zur dritten. Der Kartentausch ist auch möglich, wenn der Spieler stirbt, und Monster greifen den Spieler erst an, wenn der Spieler zuerst auf sie schießt.

Was die Musik betrifft, nutzt die Demo öffentliche .S3M-Dateien und der Soundmixer verarbeitet sowohl Stereomusik als auch Soundeffekte.

Technische Grenzen

Beim Game Boy Advance gab es eine Reihe von Grenzen, die diesen Port zu einem schwierigen Spiel machten. Zu den größten Hindernissen gehörten die niedrige Taktrate, die fehlenden 3D-Grafikfunktionen des Handhelds und das Fehlen einer Gleitkommaeinheit (FPU). Es gab noch viele andere auf dem Weg, aber das waren besondere Schmerzpunkte, die Linden mir als problematisch bezeichnete. Bevor wir darauf eingehen, ist es wichtig, den Aufbau des Game Boy Advance zu verstehen.

Screenshot mit Genehmigung von Modern Vintage Gamer verwendet

Der Game Boy Advance verfügt über drei RAM-Sätze – einer ist der interne Arbeits-RAM (IWRAM), ein anderer ist der externe Arbeits-RAM (EWRAM) und der dritte ist Video-RAM (VRAM). Die 32 KB IWRAM werden zum Speichern von ARM-Anweisungen für eine schnelle Ausführung verwendet, während die 256 KB EWRAM optimal zum Speichern von Nur-Thumb-Anweisungen und kleineren Datenblöcken geeignet sind. Als Notizen von Rodrigo CopettiDer Zugriff auf EWRAM kann bis zu sechsmal langsamer sein als auf IWRAM. Der Großteil des Speichers in Form von EWRAM ist nur über einen 16-Bit-Bus zugänglich, obwohl der Game Boy Advance als 32-Bit-Handheld vermarktet wird. Auf das IWRAM konnte über einen 32-Bit-Bus zugegriffen werden. Der VRAM des Game Boy Advance hat eine Größe von 96 KB und dient zwar hauptsächlich der Speicherung von Grafikdaten, befindet sich jedoch in der Speicherkarte der CPU und kann auch als normaler Speicher verwendet werden.

Thumb-Anweisungen sind eine Teilmenge der 32-Bit-ARM-Anweisungen und eine Reihe von Anweisungen, die in 16-Bit-Wörter codiert sind. Sie verfügen über alle Vorteile von 32-Bit-Anweisungen, beanspruchen jedoch nicht so viel Platz, was sie für eine optimierte Entwicklung effizient macht. Das bedeutet, dass der Zugriff auf EWRAM zwar langsamer ist, aber effiziente Thumb-Anweisungen oft genauso schnell wie gespeicherte ARM-Anweisungen sind in IWRAM, obwohl der Nachteil von Thumb-Anweisungen darin besteht, dass es manchmal nicht ganz das Thumb-Äquivalent einer gewünschten ARM-Anweisung gibt ausführen. Das EWRAM wurde zum Speichern der Ausgabe der 3D-Mathe-Transformationslogik verwendet, bei der es sich im Wesentlichen um die Liste der Polygonkanten handelte, die dann Scanline für Scanline durch den Rasterisierungscode verfolgt wurden.

Wie Linden mir erzählt, war der Scanline-Renderer der komplexeste und schwierigste Teil der gesamten Portierung. Es besteht aus über 10.000 Zeilen hochoptimiertem ARM-Assemblercode, der dazu dient, eine Reihe von Pixeln in den VRAM zu zeichnen. Der Scanline-Renderer hat den größten Teil des 32-KB-IWRAM verbraucht. Die der Kamera am nächsten gelegenen Kanten sind aktiv und werden gerendert, und es handelt sich im Wesentlichen um einen großen BSP-Baum (Binary Space Partitioning). VRAM wurde verwendet, um die Ergebnisse der Polygontransformationsausgabe in Kantentabellen zu speichern, da nicht genügend IWRAM vorhanden war, aber VRAM auf dem Game Boy Advance ist immer noch schneller als EWRAM. Auch die Grafiken wurden hier gespeichert und angezeigt.

Er verbrachte viel Zeit damit, sich auf Optimierungen zu konzentrieren, um sicherzustellen, dass die schnellstmögliche Ausführungszeit erreicht werden konnte. Zu den drei Dingen, die er unternahm, um die Ausführungszeit zu verkürzen, gehörten die folgenden:

  • Der Code wurde vor der Ausführung selbst geändert, sodass weniger Anweisungen erforderlich waren
  • Verwendete eine Reihe von Nachschlagetabellen für Dinge wie Kehrwert, Sinus, Kosinus, Tangens usw.
  • Der CPU-„Modus“ wurde geändert, um Zugriff auf zusätzliche Register (die wie „Variablen“ sind) zu erhalten, ohne die Werte der Register speichern und wiederherstellen zu müssen.

Das Umschalten der CPU-Modi, um zusätzliche Register zu erhalten, ist ein unglaublich cleveres Manöver, das einen schnellen Zugriff auf Werte in der Nähe der CPU ermöglicht, sodass diese in einem einzigen Taktzyklus abgerufen werden können. Wie Linden mir erzählt, war es möglich, Register zu wechseln und einen Wert in einem Taktzyklus abzurufen, anstatt einen Wert im RAM des Game Boy Advance zu speichern, was länger dauerte. Die CPU selbst ist ein 16,78-MHz-Prozessor, was bedeutet, dass sie 16780000 Zyklen pro Sekunde ausführen kann. Das klingt nach viel, aber wenn Sie jedes Pixel auf dem Bildschirm berechnen und zeichnen müssen, summieren sich diese schnell und es wird wichtig, so viele Operationen wie möglich einzusparen.

Oben ist die Liste der allgemeinen Register des ARM7TDMI-Chipsatzes im Game Boy Advance. Typischerweise greifen Entwickler immer nur auf die Register im „System- und Benutzer“-Modus zu und greifen außerhalb davon auf die Verwendung normaler Variablen zurück. Allerdings nutzte er Register in allen sieben Modi des Chipsatzes, und das Beste daran ist In den Umschaltmodi bleiben weiterhin die Werte in den Registern der anderen Modi erhalten, sodass er zwischen ihnen wechseln kann ihnen.

Lustigerweise erwähnte Linden auch, wie seine Methode des Bankwechsels einen Fehler im Nanoboy Advance-Emulator aufdeckte. Wie sich herausstellte, unterstützte dieser Emulator die Verwendung der anderen Modi der CPU zum Speichern in Registern und Umschalten nicht, und seine Quake-Demo war das erste bekannte Spiel, das dies tatsächlich tat.

Linden hat uns ein Foto einiger der von ihm erstellten Notizen zur Verfügung gestellt und erklärt, wie er seine Gleitkommaberechnungen ohne eine geeignete FPU optimiert hat.

Das obige Bild ist eines, das Linden uns aus seinen Notizen mitgeteilt hat, und was besonders interessant ist, sind die „verschiedenen ARM-Zyklus-Anweisungszahlen“. Er entwickelte eine Möglichkeit, die Zyklen für Berechnungen zu optimieren, sodass er die Anzahl der Taktzyklen für eine Berechnung reduzieren konnte. Wie er es mir beschrieb, könnte eine 8-Bit-Zahl in einem Taktzyklus, eine 16-Bit-Zahl in zwei Taktzyklen, eine 32-Bit-Zahl in drei Taktzyklen und eine 64-Bit-Zahl in vier Taktzyklen multipliziert werden .

„Es gab zwei oder drei Ausführungsphasen [im ARM-Prozessor]. Angenommen, ich multipliziere Register eins mit Register zwei und trage das Ergebnis in Register drei ein. Wenn ich wüsste, dass Register zwei eine 16-Bit-Zahl ist, anstatt zu sagen: „Register eins mit Register zwei multiplizieren“, würde ich Ich würde es umdrehen und ich würde sagen, Register zwei mit Register eins multiplizieren, weil mir das eine Uhr sparen würde Zyklus."

Er erzählte mir, dass er dies getan habe, um das Maximum an Leistung aus dem Game Boy herauszuholen Vorweg, denn ein hier und da eingesparter Taktzyklus summiert sich wirklich, wenn viele Berechnungen durchgeführt werden durchgeführt. Was den selbstmodifizierenden Code betrifft, habe ich Linden gebeten, ihn zu erklären.

„Das Programm kommt aus [Speicher], es überträgt einen großen Block des Programms zur Ausführung in den internen RAM, weil es schneller ist.“ Jeder RAM-Zugriff ist viel, viel langsamer, also mache ich einen DMA (Direct Memory Access) eines großen Blocks vom ROM in den RAM und ändere dann den eigentlichen Programmcode. Beispielsweise verfügt ARM über die Fähigkeit, Operanden nach links oder rechts zu verschieben oder bestimmte Bits als Teil des Befehlssatzes auszublenden. Die Anweisung gibt an, welche Bits Sie maskieren oder um wie viele Bits Sie verschieben möchten. Also generierte ich Code, der das, was gerade ausgeführt werden sollte, basierend auf der Anzahl der zu verschiebenden Bits änderte. Ein weiteres Beispiel betrifft die 3D-Matrixmultiplikation. Da sind eine ganze Reihe von Multiplikationen im Spiel. Ich würde die eigentlichen Anweisungen, die die Multiplikationen durchführen, im internen RAM generieren und sie dann ausführen, sodass der Code während der Ausführung gewissermaßen Teile von sich selbst erstellt.“

Sich selbst modifizierender Code hat seine eigenen Nachteile, insbesondere wenn es um das Debuggen geht. Dadurch entfällt auch die Notwendigkeit von Verzweigungsanweisungen, bei denen der Code zu einer anderen Ausführungssequenz springen würde und dem Hauptthread wertvolle Rechenzeit entziehen kann. Linden sagte uns auch, dass die Nachschlagetabellen im ROM perfekt ausgerichtet sind, sodass sie ein perfektes Vielfaches eines nach links verschobenen Acht-Bit-Werts sind. Die Größe der Nachschlagetabelle ist immens und passt nicht in den RAM, und die Ausrichtung vermeidet auch die Notwendigkeit einer zusätzlichen Ladeanweisung, um die Basisadresse der Tabelle zu erhalten.

Insgesamt dauerte die Entwicklung des endgültigen Prototyps fast zwei Jahre.

Die Zukunft von Randy Lindens Quake-Hafen

Ich fragte Linden, was mit der Zukunft des Quake-Hafens geschehen würde, und er sagte mir, dass er das tun würde Ich habe darüber nachgedacht, ZeniMax und id Software nach der Veröffentlichung der Version mit dem offiziellen Quake zu fragen Vermögenswerte. Er sagte mir auch, dass er irgendwann den Quellcode veröffentlichen werde, aber derzeit lässt er sich nicht erstellen, da dafür ein älterer Computer erforderlich sei.

Randy Lindens Setup zum Anschließen eines Game Boy Advance an einen Computer für die Entwicklung.

Ich fragte Linden, warum er sich für Quake entschieden habe, und er sagte mir, dass er das Spiel und die Herausforderung liebte, die dieses „unmögliche Projekt“ mit sich brachte, da es sich um die Rückseite seiner DOOM-Portierung für SNES handelte. Er erwähnte auch, dass er aus Platzgründen zwar nicht glaubt, dass das gesamte Spiel hätte portiert werden können, der Großteil des Spiels jedoch in derselben Engine hätte sein können.

Wenn Sie daran interessiert sind, Quake für den Game Boy Advance auszuprobieren, schauen Sie sich unbedingt die Veröffentlichung auf Forest of Illusion an, die Sie unten nachlesen können.


Download von Forest of Illusion