Programmierung: Age of Empires war dank Assembler seiner Konkurrenz voraus

Sehr viele Videospiele aus den 90er Jahren machen massiven Gebrauch von Assembler zur Programmierung, besonders bekannt ist dabei Roller Coaster Tycoon, das fast ausschließlich maschinennah entwickelt wurde. Auch das erste Siedler nutzte Assembler . Die deutlichen Vorteile von Assembler damals erklärt nun auch der Entwickler Matt Pritchard auf Reddit(öffnet im neuen Fenster) , der an Age of Empires gearbeitet hat und schreibt, dass von den rund 13.000 Zeilen x86-32-Bit-Assembler in dem Spiel etwa 11.500 für das Zeichnen des Bildes auf dem Monitor verwendet worden seien.
Genutzt worden sei es vor allem zum Zeichnen der sogenannten Sprites(öffnet im neuen Fenster) , also spezieller Grafikobjekte, die überhaupt nur verwendet wurden, weil Grafikkarten zu der Zeit nur über sehr eingeschränkte Fähigkeiten verfügten. Pritchard schreibt: "Die Verwendung von Assembler im Zeichenkern führte zu einer ~10-fachen Verbesserung der Sprite-Zeichengeschwindigkeit gegenüber den C++-Referenzimplementierungen. Und der Zeichenkern von AoE war deutlich schneller als der von Konkurrenten wie Starcraft, weshalb die Standardauflösung von AoE 800 x 600 betrug, während fast alle unsere Konkurrenten eine Auflösung von 640 x 480 hatten. Wir konnten den Bildschirm genauso schnell oder schneller scrollen und mit Sprites füllen, obwohl wir doppelt so viele Pixel in der Spielwelt hatten."

Die Assembler-Nutzung begründet Pritchard darüber hinaus aber nicht nur mit der schnelleren Grafik. Vielmehr sei es zu der Zeit einfach nicht möglich gewesen, bestimmte Konzepte und Techniken in C++ umzusetzen. Außerdem konnte so die Cache-Architektur von CPUs berücksichtigt werden, ebenso wie Prozessorarchitektur der frühen Pentium-CPUs mit zwei Ausführungseinheiten (U- und V-Pipeline). Auch die Nutzung der CPU-Register sei manuell mithilfe von Assembler-Code durchgeführt worden, schreibt Pritchard.
Beschränkte Hardware der 90er Jahre
Der Entwickler erklärt darüber hinaus(öffnet im neuen Fenster) ausführlich die aus heutiger Sicht massiven Beschränkungen der PC-Hardware, insbesondere für Videospiele damals. So waren 3D-Grafikkarten fast nicht existent, und die Voodoo 1 musste als 3D-Grafikkarte parallel mit einer 2D-Karte betrieben werden. Handelsüblich gewesen seien dagegen SVGA-Chips zu Grafikbeschleunigung wie Tseng Labs ET4000(öffnet im neuen Fenster) . Die Karten damals nutzten außerdem ein lineares Speicherlayout und viele setzten auf Bank Switching(öffnet im neuen Fenster) für die Speicherverwaltung.
Der von Pritchard zur Entwicklung genutzte Rechner verfügte über eine Pentium-CPU mit 166 MHz Takt und 16 KByte Cache, der in jeweils 8KByte für Daten und Instruktionen aufgeteilt war. L1/L2/L3-Cache wie bei heutigen Systemen gab es nicht. Der Speichertakt war 66 MHz, pro Takt konnten 32 Bit übertragen werden, und der gesamte Arbeitsspeicher war 16 MByte groß. Auch dazu schreibt Pritchard, dass der Code per Assembler massiv auf die Cache-Architektur zugeschnitten war, um Cache-Line-Misses oder gar Flushes zu verhindern.
Für die 20 Jahre nach dem Original erschienene Definitive Edition von Age of Empires ersetzte Pritchard eigenen Angaben zufolge dann den Assembler-Code durch C++, da aktuelle Compiler Inline-Assembler nicht mehr unterstützten und deren Optimierungen die Nutzung auch nicht mehr erforderten. In einem alten Interview zu den Arbeiten(öffnet im neuen Fenster) sagte Pritchard außerdem, dass das Kompilieren des Spiele-Codes ursprünglich 15-20 Minuten gedauert habe. Zum Beginn der Arbeiten an der Definitive Edition sei das dank deutlich besserer Hardware und Compiler auf nur noch 20 Sekunden reduziert worden.



