2011-02-13 14 views
10

Kakao'da oyun döngülerinin yaratılmasında tartışılan bir çok internet üzerinden baktım. Oyun döngülerinin çoğunun, bir saniyede bir 60 saniyede bir olayı tetiklemek için NSTimer kullandığını gördüm. Apple'ın aşağıdaki Geliştiriciler Dokümantasyonundaki kaynak kodunda olduğu gibi, neden Grand Central Dispatch'i kullanan örneklerin olmadığı görülmektedir. Bilmediğim bir sorun mu var?Kakao oyunları neden zamanlayıcı oluşturmak için Grand Central Dispatch'dan kaçıyor?

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

Belki de NSTimer daha ünlü, GCD'den daha az korkutucu ve GCD sadece MacOS10.6.x/iOS4.x ve üstü sadece? – nacho4d

+0

Evet. Cevap için teşekkürler. Muhtemelen geriye doğru uyumlu olmadığı içindir. – Tobias

cevap

2

Yanıtın bu olduğunu düşünüyorum. Nacho4d'nin cevabını bir cevap olarak göndermesini isterdim, böylece onu yeşile kavuştum, ama bu fırsatı kendi kendine öğrenen Skinner Box ödülünü almak için kullanıyorum.

NSTimer, daha ünlü GCD daha ve GCD sadece MacOS10.6.x/iOS4.x ve yalnızca yukarıda olduğu için az korkutucu Belki çünkü? - nacho4d 13:01

12

Bu gerçekten sorunuza cevap vermez, ama (o en kolayı olabilir gerçi) normal bir zamanlayıcı mükemmel oyun döngü çözüm değildir. SO üzerinde oyun döngüleri hakkında a very good article about game loop programming ve iki previousquestions vardır, bu size daha iyi fikirler verebilir.

ana nokta tekrarlamalar arasında geçen zamana göre bir döngü içinde ayrı bir iş parçacığı üzerinde oyun döngü çalıştıran ve oyun modelini yeniden hesaplamak edilir:

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

Bu size maksimum düzgünlük verecektir. Daha fazla bilgi için bağlantılı kaynakları okuyun, güzel bir dişli oyun döngüsünün yazılması zor değildir ve büyük bir fark yaratır, IMHO.

İlgili konular