Warum ein Game-Boy-Advance-Spiel in Zig schreiben?
-
Der Reiz des Game Boy Advance
Der Game Boy Advance besitzt eine moderne CPU (32-Bit-ARM, viele Register), verwendet aber einen alten tile-basierten Renderer. Das ähnelt der Methode, die das NES in den 80er-Jahren nutzte. Als eines der letzten tile-basierten Systeme von Nintendo bietet er verschiedene Funktionen wie affine Transformationen, Transparenz, Sprite-Effekte und mehr. -
Warum die Sprache Zig gewählt wurde
Anfangs begann das Game-Boy-Advance-Projekt in C++, doch das erste vollständige Spiel wurde in Zig geschrieben. Zig ist noch in der Beta und wurde erst 15 Jahre nach dem Erscheinen des Game Boy Advance entwickelt, bietet aber dennoch Funktionen, die sich gut für Embedded-Programmierung eignen.
Toolchain
-
Linux und devKitPro
Bei der Nutzung von Linux gab es Schwierigkeiten mit der Paketverwaltung, und beim Erstellen von 3D-Szenen für den Nintendo DS musste devKitPro verwendet werden. Es enthält die GCC-Toolchain, Bibliotheken und Entwicklungswerkzeuge. Umständlich ist, dass es über den Paketmanager von ArchLinux installiert werden muss. -
Vorteile von Zig
Zig erleichtert Cross-Compilation, ohne dass ein komplexer Paketmanager eingerichtet werden muss. Das Build-System von Zig führt die Funktionbuildin der Dateibuild.zigaus, um den Build durchzuführen. Das vereinfacht den Build-Prozess und reduziert Fehler.
Packed Structs
- Warum Packed Structs wichtig sind
Der Game Boy Advance steuert die Hardware über Register statt über High-Level-API-Aufrufe. Diepacked structvon Zig optimieren das Speicherlayout und erleichtern dadurch die Hardwaresteuerung. Das ist für die Game-Boy-Advance-Programmierung eine sehr nützliche Funktion.
Comptime
- Codeausführung zur Compile-Zeit
Zig bietet die Möglichkeit, Code zur Compile-Zeit auszuführen. Dadurch lassen sich Daten bereits beim Kompilieren komprimieren, statt dies erst zur Laufzeit zu tun. Diese Funktion von Zig macht es einfach, Daten zu komprimieren.
Standardbibliothek
- Zigs flexible Standardbibliothek
Die Standardbibliothek von Zig unterstützt Generics, und Funktionen zur Speicherallokation können einen Allocator als Argument erhalten. Dadurch lassen sich benutzerdefinierte Strategien für die Speicherallokation verwenden. Zigs Standardbibliothek bleibt auch in Umgebungen mit Hardware-Beschränkungen flexibel einsetzbar.
Probleme
-
Inline-Assembler
Zig unterstützt Inline-Assembler, aber es ist nur eine Ausgabe möglich. Das wird problematisch, wenn BIOS-Funktionen des GBA mehrere Werte ausgeben müssen. -
Thumb-Code / ARM-Code
Die CPU des Game Boy Advance unterstützt den ARM-Modus und den Thumb-Modus. In Zig lassen sich ARM- und Thumb-Modus nicht explizit festlegen. -
Seltsamer Speicher
Der Videospeicher des Game Boy Advance kann nicht in 8-Bit-Einheiten beschrieben werden, was dazu führen kann, dass die Grafik durcheinandergerät. Zig optimiert beim Kopieren von Speicher mitmemcpy, doch das kann mit dem „seltsamen Speicher“ des GBA kollidieren.
1 Kommentare
Hacker-News-Kommentare
volatilein der Zig-Dokumentation nicht lösen lässt, wird empfohlen, einen Compiler-Bug zu melden.memcpyersetzt wird. Es wurde erwartet, dass diese Optimierung nur im Userspace erfolgt, und man hoffte, dass sich dies mit der Option-nostdlibautomatisch handhaben ließe.