SDL ruckelig



  • Ich habe absolut keine ahnung wo der fehler liegt. Das Programm ist 82 Zeilen lang. Ich hoffe es ist nicht unhöflich es euch zu überlassen den Fehler zu suchen.
    Ich wäre euch sehr dankbar.
    Das Programm läuft, aber das Raumschiff flackert und bewegt sich langsam, obwohl ich noch gar kein dalay eingebaut habe:

    #include <SDL\SDL.h>
    #include <stdlib.h>
    
    typedef char byte;
    
    void display(SDL_Surface* bild,SDL_Rect ausschnitt,int x, int y,SDL_Surface* screen) {
      SDL_Rect wo;
      wo.x=x;
      wo.y=y;
      wo.h=bild->h;
      wo.w=bild->w;
      SDL_BlitSurface(bild, &ausschnitt, screen, &wo);
    }
    
    int main(int argc, char *argv[]) {
      ///////////////////////////////////////////////////////////////////
      const byte DX = 8;
      const byte DY = DX;
      ///////////////////////////////////////////////////////////////////  
    
      if ( SDL_Init(SDL_INIT_EVERYTHING) < 0 ) {
        fprintf(stderr, "SDL konnte nicht initialisiert werden: %s\n", SDL_GetError());
        exit(1);
      }
      atexit(SDL_Quit);
    
      SDL_Surface* screen = SDL_SetVideoMode( 1024, 768,0, SDL_FULLSCREEN | SDL_DOUBLEBUF);
      if (screen == NULL) {
        printf ("Videomodus konnte nicht eingerichtet werden:  %s\n", SDL_GetError ());
        exit(1);
      }
    
      SDL_Surface* flieger = SDL_LoadBMP("flieger.bmp"); //3 Positionen nebeneinander
      SDL_SetColorKey(flieger, SDL_SRCCOLORKEY, SDL_MapRGB(flieger->format, 255, 0, 255));    
      SDL_Rect positionen[3];
    //bild wird zerhackstückt
      for(byte i=0;i<3;i++) {
        positionen[i].x = i*64;
        positionen[i].y = 0;
        positionen[i].w = 64;
        positionen[i].h = 49;
      }
    
      Uint8* keys;
      SDL_Event event;
      bool done=false;  
      int p=0;
      int x=0;
      int y=0;
    
      while(!(done)) {
        SDL_PollEvent(&event);
    
        keys = SDL_GetKeyState(NULL);
        if (keys[SDLK_RIGHT]) {
          x+=DX;
          p=2;
        } else {
          if (keys[SDLK_LEFT]) {
            x-=DX;
            p=1;
          } else {
            p=0;
          }
        }
        if (keys[SDLK_DOWN]) {
          y+=DY;
        }
        if (keys[SDLK_UP]) {
          y-=DY;
        } 
        if (keys[SDLK_ESCAPE]) {
          done=true;
        }
    
        SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
        display(flieger,positionen[p],x,y,screen);
        SDL_Flip(screen);
      }
    
      return EXIT_SUCCESS;  
    }
    


  • hmm.. und das beim Sswapscreen?

    hast mal die fps gezählt? vielleicht musste auch einfach mal ne Pause von 10ms einlegen, damit der sich zwischendrin erholen kann..



  • alle 58 ms wird neugezeichent=> 1000/58 = 17,24 fps
    mit 10 ms delay -> 68 ms

    neutime=SDL_GetTicks();
        dauer=neutime-alttime;
        log<<dauer<<endl;
        alttime=neutime;
    
        SDL_Delay(10);
    

    Bringt aber nichts...

    Läuft bei euch das gleiche Programm besser**?** Ihr braucht nur ein Bitmap mit 192*49 für 3 Flieger nebeneinander.



  • Wenn ich es im Fenster öffne (ohne "SDL_FULLSCREEN |") hat es nur noch 42 ms pro bild -> 23,8 fps.

    Ist der Code, oder meine Grafikkarte Schuld**?**



  • Ich finde in dem Code nicht wirklich einen Fehler...
    EDIT: auch nix was IMHO an der miesen Performance schuld sein könnte. /EDIT



  • Öhm, wahrscheinlich leg ich sowieso falsch, aber arbeitet SDL_DOUBLEBUF nicht nur im Zusammenhang mit SDL_HWSURFACE?

    So verstehe ich nämlich das, was im Wikibook steht^^

    "SDL_DOUBLEBUF In Zusammenhang mit SDL_HWSURFACE wird ein zweiter Grafikpuffer angelegt, in den geschrieben werden kann. SDL_Flip (...) zeigt dann jeweils den aktualisierten Puffer"

    http://de.wikibooks.org/wiki/SDL:_Video#Video-Modi 😉



  • hey du musst bei screen = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE | SDL_FULLSCREEN | SDL_DOUBLEBUF); weil du hast vergessen was für Surface verwendet werden müssen. also kenny hat schon recht. doublebuffering geht nur auf hwsurface und nicht auf swsurface.



  • Danke. Der Tipp hat aber kaum was gebracht. (Ich glaube ich hätte mal irgendwo gelesen, dass SDL bei SW-Surface statt Flipping einfach ein Ersatzsysthem benutzt.)
    Ich hab die BitsPerPixel auf 16 gestellt. Das hat schon sehr geholfen.
    Ist das normal für Spiele? Ich hätte nicht gedacht, dass das soviel ausmacht.

    Also auf jeden Fall bin ich jetzt zufrieden. Danke für die Hilfe.


Anmelden zum Antworten