我试图创建一个 NSThread 游戏循环,我有一些时间能够成功获得 57 FPS。
有时我的 fps 会上升到一些可笑的数字。
我不明白它是如何发生的。
我检查自上次循环以来的时间,如果它很快,则让线程休眠这么长时间。
这并不总是发生,它有时会逃避 if 检查速度并以循环方式快速。
任何评论都意味着很多。
我应该在哪里“打勾”?
- (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];
}
}