español - ¿Cuál es la mejor manera de crear un bucle de juego en el iPhone que no sea el uso de NSTimer?
cocoa framework (3)
No sé sobre el iPhone en particular, pero aún puedo ayudarlo: en lugar de simplemente conectar un retraso fijo al final del ciclo, use lo siguiente:
- Determine un intervalo de actualización que le complacería y que es más grande que una sola pasada a través de su ciclo principal.
- Al comienzo del ciclo, tome una marca de tiempo actual de cualquier resolución que tenga disponible y guárdela.
- Al final del ciclo, tome otra marca de tiempo y determine el tiempo transcurrido desde la última marca de tiempo (inicialice esto antes del ciclo).
- sleep / delay para la diferencia entre el tiempo de fotograma ideal y el tiempo ya transcurrido para el fotograma.
- En el siguiente cuadro, puede incluso intentar compensar las imprecisiones en el intervalo de sueño comparando con la marca de tiempo al comienzo del ciclo anterior. Almacene la diferencia y sume / reste del intervalo de sueño al final de este ciclo (el tiempo de espera / retraso puede ser demasiado largo O demasiado corto).
Es posible que desee tener un mecanismo de alerta que le permita saber si su tiempo es demasiado estrecho (es decir, si su tiempo de sueño después de todas las compensaciones es menor a 0, lo que significa que le está tomando más tiempo procesar que tu velocidad de cuadro lo permite). El efecto será que tu juego se ralentiza. Para obtener puntos adicionales, es posible que desee simplificar el procesamiento por un tiempo, si detecta que esto sucede, hasta que tenga suficiente capacidad libre de nuevo.
Estoy programando un juego en el iPhone. Actualmente estoy usando NSTimer para activar mi actualización / procesamiento del juego. El problema con esto es que (después del perfilado) parece que pierdo mucho tiempo entre actualizaciones / renders y esto parece tener que ver principalmente con el intervalo de tiempo que conecto a NSTimer.
Entonces mi pregunta es ¿cuál es la mejor alternativa para usar NSTimer?
Una alternativa por respuesta, por favor.
Puede obtener un mejor rendimiento con hilos, pruebe algo como esto:
- (void) gameLoop
{
while (running)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self renderFrame];
[pool release];
}
}
- (void) startLoop
{
running = YES;
#ifdef THREADED_ANIMATION
[NSThread detachNewThreadSelector:@selector(gameLoop)
toTarget:self withObject:nil];
#else
timer = [NSTimer scheduledTimerWithTimeInterval:1.0f/60
target:self selector:@selector(renderFrame) userInfo:nil repeats:YES];
#endif
}
- (void) stopLoop
{
[timer invalidate];
running = NO;
}
En el método renderFrame
, prepara el framebuffer, dibuja el cuadro y presenta el framebuffer en la pantalla. (PD: hay un excelente article sobre varios tipos de bucles de juego y sus pros y contras).
Use CADisplayLink, puede encontrar cómo en el proyecto de plantilla de OpenGL ES provisto en XCODE (cree un proyecto a partir de esta plantilla y eche un vistazo a la clase EAGLView, este ejemplo se basa en GL abierta, pero puede usar CADisplayLink solo para otra tipo de juegos