DOS Framebuffer

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

1void clear_image(unsigned char back_color) {
2  for(int y = 0; y < height; ++y) {
3    for(int x = 0; x < width; ++x) {
4      set_pixel(x, y, back_color);
5    }
6  }
7}

in etwa in ein:

1void clear_image(unsigned char back_color) {
2  unsigned char* pixel_ptr = get_pixel_ptr(0, 0);
3  size_t length = width * height;
4  memset(pixel_ptr, back_color, length);
5}

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.

📧 📋 🐘 | 🔔
 

Meine Dokus über:
 
Weitere externe Links zu:
Alle extern verlinkten Webseiten stehen nicht in Zusammenhang mit opengate.at.
Für deren Inhalt wird keine Haftung übernommen.



Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!