2011-02-13 41 views
10

我在網上討論了在可可中創建遊戲循環的問題。我見過的大部分遊戲循環都使用NSTimer每隔60秒觸發一次事件。爲什麼似乎沒有使用Grand Central Dispatch的示例,就像下面的Apple開發人員文檔的源代碼一樣。有沒有我不知道的問題?爲什麼可可遊戲避免Grand Central Dispatch創建計時器?

dispatch_source_t CreateDispatchTimer(uint64_t interval, 
       uint64_t leeway, 
       dispatch_queue_t queue, 
       dispatch_block_t block) 
{ 
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 
                0, 0, queue); 
    if (timer) 
    { 
     dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), interval, leeway); 
     dispatch_source_set_event_handler(timer, block); 
     dispatch_resume(timer); 
    } 
    return timer; 
} 
+14

也許是因爲NSTimer比GCD更有名,比GCD更可怕,因爲GCD只是MacOS10.6.x/iOS4.x及更高版本? – nacho4d 2011-02-13 08:01:03

回答

2

這是我認爲答案是。我希望nacho4d能夠發佈它作爲答案,以便我可以綠化它,但我利用這個機會獲得自學者Skinner Box獎勵。

也許是因爲的NSTimer是比較有名的, 比GCD因爲 GCD只有MacOS10.6.x/iOS4.x和 上面只有那麼可怕? - nacho4d Feb 13 at 8:01

12

這並不能真正回答你的問題,但普通計時器並不是完美的遊戲循環解決方案(雖然它可能是最簡單的一個)。有關於SO上的遊戲循環的a very good article about game loop programming和兩個previousquestions可能會給你更好的想法。

主要問題是運行在一個環路一個單獨的線程遊戲循環,並重新計算博弈模型根據迭代之間的時間間隔:

- (void) gameLoop 
{ 
    while (running) { 
     CFAbsoluteTime now = CFAbsoluteTimeGetCurrent(); 
     CFTimeInterval deltaTime = now - lastTime; 
     [self updateModelWithDelta:deltaTime]; 
     [self renderFrame]; 
     lastTime = now; 
    } 
} 

這會給你最大的平滑度。閱讀鏈接源獲取更多信息,編寫一個不錯的線程化遊戲循環並不困難,而且有很大的不同,恕我直言。

相關問題