2008-09-18 33 views
23

我正在iPhone上編寫遊戲。我目前使用NSTimer來觸發我的遊戲更新/渲染。問題在於(分析後),我在更新/呈現之間似乎失去了很多時間,這似乎主要與插入NSTimer的時間間隔有關。除了使用NSTimer之外,在iPhone上創建遊戲循環的更好方法是什麼?

所以我的問題是什麼是使用NSTimer的最佳選擇?

請每個答案一個替代。

+0

你看過iPhone開發者的例子嗎?我認爲有一些例子(Touch Fighter或CrashLanding ,例如)這可能是照亮的 – 2008-09-18 20:18:18

+0

我看了很多例子,並在互聯網上研究了其他選擇,所以我已經知道了一些替代方案,我真正追求的是別人認爲最好的選擇是什麼?非常笑rt項目,因此任何時候都可以節省調查時間。 – 2008-09-18 20:21:14

回答

4

我不知道有關iPhone特別,但我仍然可以幫助: 而不是在循環結束在一個固定的延時簡單地插入,使用以下命令:

  • 確定一個你很滿意的刷新時間間隔,並且大於一次通過主循環的時間間隔。
  • 在循環開始時,獲取當前可用的任何分辨率的時間戳並存儲它。
  • 在循環結束時,取另一個時間戳,並確定自上次時間戳以來的經過時間(在循環之前對其進行初始化)。
  • 睡眠/延遲您理想的幀時間和幀的已用時間之間的差異。
  • 在下一幀中,您甚至可以嘗試通過比較前一個循環開始時的時間戳來補償睡眠間隔中的不準確性。存儲差異並在此循環結束時從睡眠間隔中添加/減去它(睡眠/延遲可能會太長或太短)。

你可能想要一個提醒機制,讓你知道你的時間是否太緊張(即,如果你的睡眠時間在所有補償後小於0,這意味着你是花費更多的時間來處理比幀速率允許的更多的時間)。效果將會是你的遊戲變慢。對於額外的點,如果您檢測到這種情況,您可能想要簡化渲染一段時間,直到您再次擁有足夠的剩餘容量爲止。

18

你可以得到線程有更好的表現,嘗試這樣的:

- (void) gameLoop 
{ 
    while (running) 
    { 
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
     [self renderFrame]; 
     [pool release]; 
    } 
} 

- (void) startLoop 
{ 
    running = YES; 
#ifdef THREADED_ANIMATION 
    [NSThread detachNewThreadSelector:@selector(gameLoop) 
    toTarget:self withObject:nil]; 
#else 
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f/60 
    target:self selector:@selector(renderFrame) userInfo:nil repeats:YES]; 
#endif 
} 

- (void) stopLoop 
{ 
    [timer invalidate]; 
    running = NO; 
} 

renderFrame方法您準備的幀緩衝,並條機和在屏幕上顯示的幀緩存。 (PS上有各種類型的遊戲循環和他們的優點和缺點有很大article

0

使用CADisplayLink,你可以找到如何在Xcode提供了OpenGL ES模板項目(創建這個模板開始一個項目,看看EAGLView類,這個例子是基於開放GL,但你可以使用CADisplayLink只用於其他類型的遊戲

相關問題