Im trying to create a NSThread game loop, i have some of the time been able to get a successful 57 FPS.
Some of the time my fps goes up to some ridiculice number.
I dont understand how its happening.
I check how long since the last loop and if it was to quick, sleep the thread for that much time.
This is not always happening, it sometimes escapes the if check on the speed and does the loop way to fast.
Any comments would mean alot.
Also where am i suposed to ‘Tick’ ?
- (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 < 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];
}
}
You shouldn’t rely on sleeping a thread because you can never be sure it will take the same amount of time.
So instead of making a thread sleep, do nothing with it, nothing at all (except of course with incrementing your fixed time step)
You will find you will have a much smoother Frame Rate then.
Also as a side note, don’t use FPS as a performance indicator. Use the amount of time a single update has taken to be completed.
If you are aiming @ 60fps, your goal processing time should be 0.01666* seconds. In reality you should be able to increase your processing time to 0.02555* which is 40fps and there should be no noticable performance hit on the game
EDIT: I also noticed you are creating a new pool and draining everytime the update is hit, in my experiences the autorelease pools should be placed at higher levels such appDelegate. But I wouldn’t take it any lower then the level creation(create)/release(drain), moving this further up will help with performance as well.