Olá pessoal. Neste breve artigo, mostrarei como criar um timer em seu aplicativo no Corona SDK com um indicador aceitável de precisão de leitura. Considere também quais são os problemas do cronômetro padrão.
O seguinte problema será resolvido no artigo: Para criar um aplicativo que mostre o tempo decorrido desde que o aplicativo foi ativado com sua atualização 1 vez por segundo.
1. A solução padrão óbvia.
Crie um cronômetro padrão e exiba seus ticks.
timeout = 1000 timer.performWithDelay( timeout,function(event) print(event.count) end,0)
Tudo parece óbvio, mas há recursos no trabalho desta solução:
- Em primeiro lugar, o timer padrão é capaz de calcular o tempo limite de maneira correta e precisa, começando de 300 a 400ms, e tudo abaixo desse valor começa a ficar muito significativo, mas nosso caso é diferente, pois o tempo limite é superior aos limites especificados. O período mínimo de tick possível do timer (se você especificar 1 ms) é 1 / fps, ou seja, 16. (6) ms para 60 quadros ou 33. (3) ms para 30 quadros.
- Em segundo lugar, mesmo no período relativamente exato indicado, há um erro aleatório de cerca de 5 a 10 ms de cada marca, isto é, um erro de 15 a 30 segundos ocorre em uma hora. Esse problema pode ser parcialmente resolvido subtraindo 5 ms do valor especificado no parâmetro ao criar o timer, ou seja, em vez de 1000, especifique 995.
- Em terceiro lugar, se pequenos frisos ocorrerem no seu aplicativo causados pelo resultado de outro código ou pela operação instável do dispositivo, esses frisos também serão adicionados à lista de pendências do timer.
- Quarto, se você minimizar o aplicativo por algum tempo e depois reimplementá-lo, todo o tempo em que o aplicativo tiver sido minimizado será excluído do número de segundos em que o aplicativo estiver em execução.
2. Uma boa decisão.
Para resolver os problemas do método anterior, usamos o design a seguir; nesse método, usamos um timer com a velocidade mais alta possível, mas o sinal do timer será um cálculo baseado na fonte da hora exata do sistema.
local timeout = 1000
Analisamos os recursos desse método. Apesar de indicarmos uma frequência de escala de 1ms, conforme descrito acima, os quanta de escala real serão executados a cada 16 (33) -50ms, e isso determinará o erro máximo possível do método acima, o erro variará no intervalo de 0 a 50ms de tick to tick, ou seja, a taxa de repetição do tiquetaque será menos estável do que no primeiro método, mas o valor desse erro a qualquer distância (mesmo em anos) será o mesmo, ou seja, mesmo depois de um ano, nosso próximo tick terá um erro no mesmo intervalo em relação ao primeiro tick.
3. Verificação dos resultados
Vou dar um exemplo de como verificar a justiça de todos os itens acima. A fonte fornecida exibirá uma vez por segundo o tempo atual decorrido desde que o aplicativo foi ativado por dois temporizadores (separadamente) e mostrará o erro acumulado durante a operação.
local timeout = 1000 socket = require "socket" local start_time = socket.gettime()*1000
Boa sorte a todos!