Hola a todos En este breve artículo, le diré cómo hacer un temporizador en su aplicación en el Corona SDK con un indicador aceptable de precisión de lectura. También considere cuáles son los problemas del temporizador estándar.
El siguiente problema se resolverá en el artículo: Cree una aplicación que muestre el tiempo transcurrido desde que la aplicación se activó con su actualización 1 vez por segundo.
1. La solución estándar obvia.
Crea un temporizador estándar y muestra sus ticks.
timeout = 1000 timer.performWithDelay( timeout,function(event) print(event.count) end,0)
Todo parece ser obvio, pero hay características en el trabajo de esta solución:
- En primer lugar, el temporizador estándar puede calcular de manera correcta y bastante precisa los tiempos de espera a partir de 300-400 ms, y todo lo que está por debajo de este valor comienza a retrasarse de manera muy significativa, pero nuestro caso es diferente ya que el tiempo de espera es mayor que los límites especificados. El período mínimo de tick posible del temporizador (si especifica 1 ms) es 1 / fps, es decir 16. (6) ms para 60 cuadros o 33. (3) ms para 30 cuadros.
- En segundo lugar, incluso en el período relativamente preciso indicado, hay un error aleatorio de aproximadamente 5-10 ms de cada marca, es decir, Un error de 15-30 segundos se ejecuta en una hora. Este problema puede resolverse parcialmente restando 5 ms del valor que se especifica en el parámetro al crear el temporizador, es decir. en lugar de 1000, especifique 995.
- En tercer lugar, si aparecen pequeños frisos en su aplicación causados por el resultado de otro código o la operación inestable del dispositivo, estos frisos también se agregarán al trabajo atrasado del temporizador.
- Cuarto, si minimiza la aplicación durante algún tiempo y luego la vuelve a implementar, todo el tiempo que la aplicación se haya minimizado se excluirá de la cantidad de segundos que la aplicación ha estado ejecutándose.
2. Una buena decisión.
Para resolver los problemas del método anterior, utilizamos el siguiente diseño, en este método usamos un temporizador con la velocidad más alta posible, pero la señal para el temporizador de tic será un cálculo basado en la fuente del tiempo exacto del sistema.
local timeout = 1000
Analizamos las características de este método. A pesar del hecho de que indicamos la frecuencia de tics 1ms como se describió anteriormente, los cuantos de tick reales se realizarán cada 16 (33) -50ms, y esto determinará el error máximo posible del método anterior, el error variará en el rango 0..50ms de tic a tic, es decir la tasa de repetición de tics será menos estable que en el primer método, pero el valor de este error a cualquier distancia (incluso en años) será el mismo, es decir incluso después de un año, nuestro próximo tic tendrá un error en el mismo rango en relación con el primer tic.
3. Verificación de los resultados.
Daré un ejemplo de cómo verificar la justicia de todo lo anterior. La fuente dada mostrará una vez por segundo el tiempo actual transcurrido desde que se encendió la aplicación durante dos temporizadores (por separado) y mostrará el error acumulado durante la operación.
local timeout = 1000 socket = require "socket" local start_time = socket.gettime()*1000
¡Buena suerte a todos!