Primero, mi pregunta: ¿cómo gestionas tu iOS Run-Loop?iOS Games y Run-Loop Management
Próxima mi razón: he estado investigando esto con una variedad de prototipos (v. Desarrollo de etapa inicial) y he encontrado una serie de problemas desconcertantes.
- cuestiones primer lugar, de entrada y el bucle de ejecución me llevan a intentar lo siguiente:
- cuando se utiliza el sistema más recomendado (CADisplayLink) He observado que ciertas entradas táctiles se dejan caer una vez que la carga de la CPU hace que el búfer voltear (presentRenderBuffer) para tener que esperar un marco. Esto ocurre solo en el dispositivo y no en el simulador (molestamente - esto parece estar relacionado con esperar el bloqueo vsync en el hilo principal & la forma en que el proceso de ejecución de la aplicación toca la entrada & come mensajes)
- cuando se usa el siguiente sistema más recomendado (NSTimer) Noté que ciertas entradas táctiles se eliminan una vez que la carga de la CPU alcanza cierto punto en el simulador pero no en el dispositivo (también de manera molesta). NSTimer también da como resultado una menor precisión cuando mis actualizaciones disparan
- cuando uso el sistema menos recomendado (ejecutando el ciclo de ejecución en su propio subproceso administrado internamente con un temporizador de alta precisión construido desde mach_absolute_time, todos mis problemas de entrada táctil desaparecen, sin embargo, mi código ASSERT ahora atrapa el hilo equivocado y solo si duermo después de la interrupción del software. (Mi código de afirmación es similar al http://iphone.m20.nl/wp/?p=1) Me gusta mucho tener mi trampa del código afirmar inmediatamente en la línea que causó el problema, por lo que esta solución es no es realmente viable para mí:. difíciles de depurar
- en segundo lugar, el tiempo perdido:
- mientras investigaba el sistema, descubrí que independientemente de la velocidad de fotogramas (extrañamente, pero supongo estadísticamente que todavía tiene sentido con vsync) estoy esperando aproximadamente el 22% del tiempo en la vsync. Lo he confirmado moviéndome glFlush/glFinish y jugando con la frecuencia con la que hago las llamadas de PresentBuffer. Este es el momento clave en el que me encantaría procesar IA, etc. en lugar de limitarme a bloquear una llamada gl. La única forma en que puedo pensar en esto sería mover la renderización a su propio hilo, pero no estoy seguro de si está justificado comenzar a volver a diseñar para multi-threading en un dispositivo de un solo procesador.
Así que alguien ha encontrado una bala mágica en torno a estas cuestiones? ¿Alguien tiene una arquitectura de bucle de ejecución arrolladora que es genial en esta plataforma? Por el momento parece que tengo que elegir el menor de los males.
Debo señalar: cuando digo "Las entradas se han caído", en realidad no se han caído, simplemente se retrasan entre una fracción de segundo y hasta 10 segundos. Este no es el retraso estándar visto en iOS y otros dispositivos de pantalla táctil, pero más como el retraso "Consumo de mensajes más lento que la generación de mensajes" que es acumulativo (se alarga con el tiempo) – Mark
¿Estás haciendo todo en el hilo principal? ¿Ha pensado en trasladar alguno de estos procesos a un hilo de fondo usando GCD o similar? –
También le puede interesar la discusión (tanto en respuestas como en comentarios) en esta pregunta: http://stackoverflow.com/questions/4739748/is-there-a-way-to-make-drawrect-work-right- ahora, donde se experimentan varias formas de manipular el ciclo de ejecución para actualizaciones de UI. –