title: Creating a NSThread Game Loop
body: <p>Im trying to create a NSThread game loop, i have some of the time been able to get a successful 57 FPS.</p>
  
  <p>Some of the time my fps goes up to some ridiculice number.</p>
  
  <p>I dont understand how its happening.</p>
  
  <p>I check how long since the last loop and if it was to quick, sleep the thread for that much time.</p>
  
  <p>This is not always happening, it sometimes escapes the if check on the speed and does the loop way to fast.</p>
  
  <p>Any comments would mean alot.</p>
  
  <p>Also where am i suposed to 'Tick' ?</p>
  
  <pre><code>   - (void)gameLoop{
     //gameIsRunning is set to TRUE in viewDidLoad
     while (gameIsRunnning){
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  
      //Get Current date
      NSDate *curTime = [NSDate date];
  
      //Time since last loop and vurrent date;
      NSTimeInterval timePassed_ms = [curTime timeIntervalSinceDate:old_date];// * 1000.0;
  
      NSLog(@"***************");
  
      //Cout the time interval
      NSLog(@"Loop Time %f",timePassed_ms);
  
      //Check if the loop was to fast and sleep for long enough to make up for about 60 FPS
      if (timePassed_ms &lt; 1.0/60) {
          double timeToSleep = timePassed_ms - (1.0/60);
          timeToSleep = timeToSleep*-1;
          NSLog(@"Sleep For %f",timeToSleep);
          [NSThread sleepForTimeInterval:timeToSleep];
      }
  
      //This new date is to try and check if after waiting the loop is taking the correct duration
      NSDate *newDate = [NSDate date];
      NSTimeInterval timePassed_after = [newDate timeIntervalSinceDate:curTime];// * 1000.0;
  
      //Make an fps out of this new time interval after wait
      double FPS = (1.0/timePassed_after);
      NSLog(@"FPS %f",FPS);
      NSLog(@"Adjusted Time %f",timePassed_after);
  
      NSLog(@"***************");
  
      //Reset olddate for next loop
      old_date = curTime;
  
      //Apparently this will capture touches and button events
      while(CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.002, TRUE) == kCFRunLoopRunHandledSource);
  
      //A test on moving a ball to see how smooth it will be
      [self performSelectorOnMainThread:@selector(moveBall) withObject:nil waitUntilDone:NO];
  
     [pool drain];
  
    } 
  
  }
  </code></pre>