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];
}
}