SDL: Framerate begrenzen + tatsächliche Framerate anzeigen



  • Hi!

    Ich habe heute morgen ein wenig angefangen mit SDL zu programmieren. Ich hab mir ein paar Beispiele angesehen und habe jetzt folgenden Code zusammengepastet:

    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) {
    	SDL_Init(SDL_INIT_VIDEO);
    	SDL_Surface *screen;
    	SDL_Event lastEvent;
    
    	screen = SDL_SetVideoMode(1024, 768, 24, SDL_SWSURFACE );
    
    	unsigned int const fps_max = 60;
    	unsigned int const fps_interval = 1000 / fps_max;
    	unsigned int fps_next_tick = 0;
    	unsigned int fps_current = 0;
    
    	std::stringstream windowCaption;
    
    	bool running = true;
    
    	while( running ) {
    		// Painting
    		windowCaption.str("");
    		windowCaption << "TEST[" << fps_current << "]";
    
    		SDL_WM_SetCaption(windowCaption.str().c_str(), "");
    		// fill the screen with black color
    		SDL_FillRect(screen, &screen->clip_rect, SDL_MapRGB(screen->format, 0, 0, 0));
    
    		// update the screen buffer
    		SDL_Flip(screen);
    
    		// FPS handling
    		if ( fps_next_tick > SDL_GetTicks() ) {
    			SDL_Delay( fps_next_tick - SDL_GetTicks() );
    			fps_current = 0;
    		}
    		fps_next_tick = SDL_GetTicks() + fps_interval ;
    		fps_current++;
    
    		// Input Logic
    
    		while(SDL_PollEvent(&lastEvent)) {
    			switch (lastEvent.type) {
    			case SDL_QUIT: 
    				running = false; 
    				break;
    			}
    		}
    	}
    
    	SDL_Quit();
    
    	return 0;
    }
    

    Der Code zeichnet im Endeffekt nur ein schwarzes Fenster auf den Bildschirm, die überschrift enthält die aktuellen FPS. Dabei soll das Ganze bei maximal 60 FPS laufen und hier liegt das Problem. Laut meiner google-Suche sollte der Code SDL_DELAY so aufrufen, dass genau mit 60FPS gerendert wird. Das wollte ich mit fps_current mal testen, jedoch ist der Wert immer konstant 1. Das nur mit 1FPS gerendert wird, kann ich mir gerade schwer vorstellen.
    Ich vermute mal ich habe irgendwo einen logischen Fehler, aber finde im Netz auch keinen anderen Weg außer direkt eigene Timer-Klassen o.Ä. zu schreiben und das ist mir hierfür zu aufwendig.
    Nutze VS 2010 auf Win7 64Bit, kompiliere aber derzeit für 32Bit falls das eine Rolle spielt.

    Gruß

    Pille


Log in to reply