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; } //---------------------------------------------------------------------------