title: Achieving a constant frame rate in SDL
body: <p>I'm trying to make an SDL program that runs with a constant frame rate. However I'm finding that even though my program is lagging a lot and skipping a lot of frames (even though it's running at a low frame and isn't rendering much).</p>
  
  <p>Do you guys have any suggestions to make my program run smoother?</p>
  
  <pre><code>#include "SDL.h"
  #include "SDL/SDL_ttf.h"
  
  //in milliseconds
  const int FPS = 24;
  const int SCREENW = 400;
  const int SCREENH = 300;
  const int BPP = 32;
  
  void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination) {
  
      SDL_Rect offset;
  
      offset.x = x;
  
      offset.y = y;
  
  
  
      if(SDL_BlitSurface(source, NULL, destination, &amp;offset) &lt; 0) {
          printf("%s\n", SDL_GetError());
      }
  
  }
  
  int main(int argc, char* argv[]) {
      //calculate the period
      double period = 1.0 / (double)FPS;
      period = period * 1000;
      int milliPeriod = (int)period;
      int sleep;
  
      SDL_Init(SDL_INIT_EVERYTHING);
      TTF_Init();
  
      TTF_Font* font = TTF_OpenFont("/usr/share/fonts/truetype/freefont/FreeMono.ttf", 24);
      SDL_Color textColor = { 0x00, 0x00, 0x00 };
  
      SDL_Surface* screen = SDL_SetVideoMode(SCREENW, SCREENH, BPP, SDL_SWSURFACE);
      SDL_Surface* message = NULL;
  
      Uint32 white = SDL_MapRGB(screen-&gt;format, 0xFF, 0xFF, 0xFF);
  
      SDL_Event event;
  
      char str[15];
  
      Uint32 lastTick;
      Uint32 currentTick;
      while(1) {
          while(SDL_PollEvent(&amp;event)) {
              if(event.type == SDL_QUIT) {
                  return 0;
              }
              else {
                  lastTick = SDL_GetTicks();
  
                  sprintf(str, "%d", lastTick);
                  message = TTF_RenderText_Solid(font, str, textColor);
                  if(message == NULL) { printf("%s\n", SDL_GetError()); return 1; }
  
                  //the actual blitting
                  SDL_FillRect(screen, &amp;screen-&gt;clip_rect, white);
                  apply_surface(SCREENW / 2, SCREENH / 2, message, screen);
  
                  currentTick = SDL_GetTicks();
  
                  //wait the appropriate amount of time
                  sleep = milliPeriod - (currentTick - lastTick);
                  if(sleep &lt; 0) { sleep = 0; }
                  SDL_Delay(sleep);
  
                  SDL_Flip(screen);
              }
          }
      }
  
      TTF_CloseFont(font);
      TTF_Quit();
      SDL_Quit();
  
      return 0;
  }
  </code></pre>