DOS Framebuffer
« | 16 Jul 2023 | »Das Tool DOSBox startet mit Standard Einstellungen seine Emulation mit nur wenigen CPU Zyklen, und trotzdem lässt sich darin Prince of Persia flüssig spielen.
Warum also läuft mein Code so grottig darin?
Wenn man Code wie ein Anfänger schreibt, dann darf man sich nicht wundern, wenn die CPU den Code auch wie ein Anfänger ausführt.
Also schlecht.
In meiner generischen Implementierung für den Zugriff auf Rastergrafiken
werden die Pixel per (x,y)
Koordinaten durchgelaufen um die Farben auf
die einzelnen Pixel zu übertragen.
Das ist natürlich höchst ineffizient, denn bei jeder Pixel-Operation wird
y
mit der Bildlänge ausmultipliziert und x
addiert um zur richtigen
Speicherstelle zu gelangen.
Es ist ineffizient, dafür aber generisch und läuft überall.
Um jetzt aber ordentliche Frame-Raten zu erzielen, habe ich optimierte Funktionen geschrieben, um diverse Operationen direkt per Zeigerarithmetik ohne lange Rechnungen auszuführen.
Vergessen hatte ich das aber bei einer nicht ganz unwichtigen Routine:
nämlich clear()
, die da Bild löscht, bzw. mit einer bestimmten
Hintergrundfarbe vollständig übermalt.
Tja, am Windows PC mit 3 GHz+ fällt der Fehler natürlich nicht auf, denn auch
das langsamste clear
wird dort in Sekundenbruchteilen umgesetzt.
Startet man das ganze aber im DOS Emulator mit den simulierten Geschwindigkeiten eines 80286 / 80386 dauert es plötzlich mehrere Sekunden, bis der Schirm “frei” wird, wenn der Bildpuffer mit der ineffizienten Codevariante gelöscht wird.
Beste Lösung: memset()
Ich änderte also die Löschroutine von einem
in etwa in ein:
und schon war “das Spiel” 10 mal schneller.
Fazit
Vor 25 Jahren waren solche Optimierungen für mich ein absolutes Muss
und auch ein riesigen Spaß bei der Implementierung.
Ich bin heute fast etwas entsetzt, dass mir so eine generische Routine
“durchgerutscht” ist, und ich es nicht sofort bemerkt hatte.
In diesem Sinne wieder mal “ein Hoch auf DOS” und den Emulator DOSBox
.
Dort lernt man nämlich wirklich gutes Ressourcenmanagement …
… weil man nur so wenig hat.