SDL ruckelt manchmal



  • Ich hab euch mal meine main reinkopiert. Folgendes Problem, ich zähle für jeden Schleifendurchlauf die Zeit in Milisekunden und lass die mir ausgeben und der ist eigentlich fast immer 0 ms (als schneller als 1ms) aber manchmal kommt dann immer mal ein durchlauf dazwischen mit 30 - 40 ms. Dieser kommt aber nicht periodisch sondern föllig wahllos. Es springt auch kein Gerät in meinem Computer (wie etwa CD-Rom) zu diesem Zeitpunkt in meinem Rechner an womit ich mir das erklären könnte. Ich dacht erst es hängt vielleicht an meiner Logicschleife aber da dies nicht periodisch auftritt ist das auch unwahrscheinlich. Tja nun bin ich ratlos und hoffe auf Hilfe. Falls ihr noch Infos braucht fragt einfach.

    WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
      //SDL initialisieren
      if (SDL_Init(SDL_INIT_EVERYTHING)==-1)
        return 0;
    
      //Regisrieren für Beendigung
      atexit(SDL_Quit);
    
      //Videomode und Backbuffer setzen
      display = SDL_SetVideoMode(1024, 768, 16, SDL_HWSURFACE | SDL_DOUBLEBUF
                                                              | SDL_FULLSCREEN
                                                                                 );
      if (!display)
        return 0;
    
      //AB HIER ERTSMAL NUR TEST
    
      //die Autodatei laden und ins richtige Format wandeln incl. Colorkey
      SDL_Surface* buffer = SDL_LoadBMP("porsche 2.bmp");
      SDL_Surface *car = NULL;
      if (buffer){
        SDL_SetColorKey(buffer, SDL_SRCCOLORKEY, SDL_MapRGB(buffer->format, 255, 255, 255));
        car = SDL_DisplayFormat(buffer);
        SDL_FreeSurface(buffer);}
    
      CCar* Car = new CCar();
      Uint32 LastTick = SDL_GetTicks();
      int frames = 0;
      Uint32 Tick = 0;
    
      while(true)
      {
         Tick  = SDL_GetTicks();
    
          while(LastTick<SDL_GetTicks())
          {
    
              //Logik ausführen
              //wie Bewegung etc.
              Car->LogicCar();
    
              LastTick+=TICKTIME;
              if(LastTick+10000<SDL_GetTicks())
                  LastTick=SDL_GetTicks()+TICKTIME;
          }
    
          //Render();    
    
          /////////////
    
          //Grafik darstellen
    
          int x;
          int y;
          SDL_Rect srcRect, dstRect;
          srcRect.w = 60;
          srcRect.h = 60;
          dstRect.w = 60;
          dstRect.h = 60;
          Car->BildPosition(x, y);
          srcRect.x = x;
          srcRect.y = y;
          Car->GetPos(x,y);
          dstRect.x = x;
          dstRect.y = y;
    
          SDL_FillRect( display, 0, SDL_MapRGB( display->format, 0, 0, 0 ) );
          SDL_BlitSurface(car, &srcRect, display, &dstRect);
          SDL_Flip( display );
          //////////////////////////
    
          //Tastaturbehandlung
          SDL_PumpEvents();
          Uint8 *keystate = SDL_GetKeyState(NULL);
    
          if (keystate[SDLK_RIGHT])
            Car->NachRechts(0.1);
          if (keystate[SDLK_LEFT])
            Car->NachLinks(0.1);
          if (keystate[SDLK_UP])
            Car->Beschleunigen(0.05);
          if (keystate[SDLK_DOWN])
            Car->Bremsen(0.05);
          if (keystate[SDLK_SPACE])
            Car->Handbremse();
          if (keystate[SDLK_ESCAPE])
            break;
    
          frames = (SDL_GetTicks()-Tick);
          LOG << frames << ENDL;
      }
    
      delete Car;
      return 0;
    }
    //---------------------------------------------------------------------------
    

Anmelden zum Antworten