SDL: Unglaublich schlechte Performance



  • Ich will mit SDL ein kleines, aber schnelles Game proggen. Mein Problem:
    Wenn ich allein folgenden Code ausführe...

    #include <SDL/SDL.h>
    #include <windows.h>
    
    int main (int argc, char *argv[])
    {
        SDL_Surface *screen = NULL;
        char fps[64];
        int f=0;
    
        screen = SDL_SetVideoMode (1024, 768, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    
        Uint32 time=SDL_GetTicks();
        while(SDL_GetTicks()-time<1000)
        {
          SDL_Flip(screen);
          f++;
        }
    
        wsprintf(fps,"fps: %i",f);
        MessageBox(NULL,fps,fps,0);
    
        SDL_Quit();
        return 0;
    }
    

    ...kriege ich eine MessageBox mit einer 57. Dass heißt, das Game schafft es gerade mal 57mal in der Sekunde das darzustellende Surface in den Grafikspeicher zu schreiben. Wenn ich jedoch noch umfangreiche Blitting-Operationen hinzufüge nimmt die Performance erheblich ab. Wenn ich allein ein 1024x768 großes Bild vor dem flippen immer auf das screen Surface blitte, habe ich nur noch gut 20 fps. Und da ich ein schnelles Spiel mache, ist ja jedesmal ein anderes Bild zu sehen, weil sich der Hintergrund ja immer bewegt. Sagen wir mal ich würde bloß die wechselnde Umgebung vor jedem flippen auf das screen Surface blitten und noch ein paar Berechnungen zum Standpunkt der Spielerposition und der einiger Gegner und würde dieses Bild jedesmal komplett neu zeichnen, dann würde ich es ja noch nicht mal schaffen, dass das Spiel flüssig läuft.

    Mein System:
    AMD XP 1800+ (1533mhz)
    256DDR-Ram
    GeForce 2Ti

    Zugegeben, nicht das beste System, aber es sollte trotzdem mein Spiel noch ohne weiteres mit über 60fps schaffen.

    Also, wie kommt die geringe fps-Rate zu stande? Habe ich irgendwas komplett falsch verstanden? Kann man es mit Tricks einen mächtigen Geschwindigkeits-SChub geben? Oder ist vielleicht einfach SDL dran Schuld?



  • Da ich lange nichts mehr mit SDL gemacht habe nur zwei Vermutungen:
    1. SDL versucht afair die Ausgabe möglichst mit der Wiederholrate des Bildschirms zu synchronisieren. Wenn diese bei Dir bei ungefähr 60Hz liegt, wäre die ähnlich hohe Anzahl von FPS im "Leerlauf" vielleicht dadurch zu erklären.
    2. Die Performance beim Blitten kann dramatisch einbrechen, wenn die zu blittenden Surfaces und das "Screen-Surface" nicht das gleiche Format haben. Schau Dir mal SDL_DisplayFormat(SDL_Surface *surface) an.

    Ob das System wirklich nicht schneller kann, oder ob der Code die Ausführungsgeschwindigkeit begrenzt, ließe sich auch mit einem SDL-Programm wie Simutrans testen.

    Grundsätzlich ist SDL aber keine Offenbarung, was die Geschwindigkeit angeht. Ich nutze es eigentlich nur zur Initialisierung von OpenGL und zeichne dann mit einer orthogonalen Projektionsmatrix direkt unter OpenGL weiter. Ist genauso einfach und portabel aber schneller in der Ausführung.


Anmelden zum Antworten