2011-02-13 1 views
10

Je me suis beaucoup regardé sur Internet pour discuter de la création de boucles de jeu dans Cocoa. La plupart des boucles de jeu que j'ai vues utilisent NSTimer pour déclencher un événement tous les 60 secondes. Pourquoi ne semble-t-il pas y avoir d'exemples utilisant Grand Central Dispatch, comme dans le code source de la documentation des développeurs d'Apple ci-dessous. Y a-t-il un problème que je ne connais pas?Pourquoi les jeux Cocoa évitent-ils Grand Central Dispatch de créer une minuterie?

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

Peut-être parce que NSTimer est plus célèbre, moins effrayant que GCD et parce que GCD est seulement MacOS10.6.x/iOS4.x et ci-dessus seulement? – nacho4d

+0

Oui. Merci pour la réponse. C'est probablement parce que ce n'est pas rétrocompatible. – Tobias

Répondre

2

Voici ce que je pense que la réponse est. J'aurais aimé que nacho4d l'affiche comme une réponse pour que je puisse la verdir, mais j'utilise cette opportunité pour obtenir la récompense de l'auto-apprenant Skinner Box.

Peut-être parce que NSTimer est plus célèbre, moins effrayant que GCD et parce que GCD est seulement MacOS10.6.x/iOS4.x et ci-dessus ne? - nacho4d 13 février à 8:01

12

Cela ne veut pas vraiment répondre à votre question, mais une minuterie régulière est pas la solution de boucle de jeu parfait (mais il est peut-être le plus facile). Il ya a very good article about game loop programming et deux previousquestions sur les boucles de jeu sur SO qui pourraient vous donner de meilleures idées.

Le principal point est en cours d'exécution de la boucle de jeu sur un thread séparé dans une boucle et recalcule le modèle de jeu en fonction du temps écoulé entre les itérations:

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

Cela vous donnera la douceur maximale. Lire les sources liées pour plus d'informations, l'écriture d'une belle boucle de jeu fileté n'est pas difficile et fait une grande différence, à mon humble avis.

Questions connexes