Quiero separar la lógica del juego y la renderización en dos bucles diferentes, porque no quiero que los fps controlen la velocidad del juego. Traté de lograr esto creando un CADisplayLink para el renderizado y un NSTimer para la lógica del juego. Pero luego sucedió algo extraño:Bucle de juego con temporizador separado para renderizar y lógica de juego
A veces (1 de cada 15 ejecuciones de aplicaciones) el juego se ejecuta en un fps muy bajo (alrededor de 5-10), pero el resto del tiempo es completamente uniforme. Si elimino el NSTimer de la lógica del juego y combino los dos bucles, el fps es constantemente alto, pero obviamente no es una solución aceptable. Parece que a veces los dos temporizadores se "retrasan" o algo así, pero no entiendo completamente el funcionamiento interno de los runloops.
Así es como se crea el temporizador y el displaylink:
NSTimer *gameTimer = [[NSTimer alloc] initWithFireDate:[NSDate date] interval:1.0/60.0 target:self selector:@selector(gameTimerFired:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:gameTimer forMode:NSDefaultRunLoopMode];
[gameTimer release];
CADisplayLink *aDisplayLink = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(drawFrame)];
[aDisplayLink setFrameInterval:animationFrameInterval];
[aDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
self.displayLink = aDisplayLink;
¿Me puede decir lo que causa el problema fps y cómo solucionarlo?
¿O puede recomendar alguna otra solución para separar la reproducción y el bucle lógico del juego?
No se supone que crear dos bucles de separar la velocidad del juego y fps ... – thedaian
Entonces, ¿cómo puedo hacerlo con un bucle? – mikabast