2011-02-13 16 views
10

Me buscaron mucho en Internet discutiendo la creación de bucles de juego en Cocoa. La mayoría de los bucles del juego que he visto usan NSTimer para activar un evento cada 60 de segundo. ¿Por qué no parece haber ejemplos que utilicen Grand Central Dispatch, como en el código fuente de la documentación para desarrolladores de Apple a continuación? ¿Hay algún problema que yo no sepa?¿Por qué los juegos de Cocoa evitan Grand Central Dispatch por crear un temporizador?

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

Tal vez porque NSTimer es más famoso, menos atemorizante que GCD y porque GCD solo es MacOS10.6.x/iOS4.x y superior solamente? – nacho4d

+0

Sí. Gracias por la respuesta. Probablemente se deba a que no es compatible con versiones anteriores. – Tobias

Respuesta

2

Esto es lo que creo que es la respuesta. Ojalá nacho4d lo hubiera publicado como respuesta para poder usarlo, pero estoy aprovechando esta oportunidad para obtener la recompensa de Skinner Box para autoaprendizaje.

Tal vez porque NSTimer es más famoso, menos aterrador que GCD y debido GCD es solamente MacOS10.6.x/iOS4.x y sólo por encima? - nacho4d 13 de febrero a las 8:01

12

Esto en realidad no soluciona su problema, sino un temporizador normal no es la solución perfecta bucle del juego (aunque podría ser la más fácil). Hay a very good article about game loop programming y dos previousquestions sobre bucles de juegos en SO que podrían darle mejores ideas.

El punto principal se está ejecutando el bucle de juego en un hilo separado en un bucle y vuelve a calcular el modelo de juego de acuerdo con el tiempo transcurrido entre las iteraciones:

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

esto le dará la máxima suavidad. Lea las fuentes vinculadas para obtener más información, escribir un bonito bucle de enhebrado no es difícil y hace una gran diferencia, en mi humilde opinión.

Cuestiones relacionadas