Bonjour à tous. Dans ce court article, je vais vous expliquer comment créer une minuterie dans votre application sur le SDK Corona avec un indicateur acceptable de précision de lecture. Considérez également quels sont les problèmes de la minuterie standard.
Le problème suivant sera résolu dans l'article: Créez une application qui affichera le temps écoulé depuis que l'application a été activée avec sa mise à jour 1 fois par seconde.
1. La solution standard évidente.
Créez une minuterie standard et affichez ses ticks.
timeout = 1000 timer.performWithDelay( timeout,function(event) print(event.count) end,0)
Tout semble évident, mais il y a des fonctionnalités dans le travail de cette solution:
- Tout d'abord, la minuterie standard est capable de calculer correctement et assez précisément les délais d'attente à partir de 300 à 400 ms, et tout ce qui est inférieur à cette valeur commence à être très important, mais notre cas est différent car le délai d'attente est supérieur aux limites spécifiées. La période de tick minimum possible du temporisateur (si vous spécifiez 1 ms) est de 1 / fps, c'est-à-dire 16. (6) ms pour 60 images ou 33. (3) ms pour 30 images.
- Deuxièmement, même à la période relativement précise indiquée, il y a une erreur aléatoire d'environ 5 à 10 ms à chaque tick, c'est-à-dire une erreur de 15-30 secondes se produit en une heure. Ce problème peut être partiellement résolu en soustrayant 5 ms de la valeur spécifiée dans le paramètre lors de la création du temporisateur, c'est-à-dire au lieu de 1000, spécifiez 995.
- Troisièmement, si de petites frises apparaissent dans votre application en raison du résultat d'un autre code ou du fonctionnement instable de l'appareil, ces frises seront également ajoutées à l'arriéré du minuteur.
- Quatrièmement, si vous réduisez l'application pendant un certain temps, puis la redéployez, tout le temps pendant lequel l'application a été réduite sera exclu du nombre de secondes pendant lesquelles l'application a été exécutée.
2. Une bonne décision.
Pour résoudre les problèmes de la méthode précédente, nous utilisons la conception suivante, dans cette méthode, nous utilisons une minuterie avec la vitesse la plus élevée possible, mais le signal de la minuterie sera un calcul basé sur la source de l'heure exacte du système.
local timeout = 1000
Nous analysons les caractéristiques de cette méthode. Malgré le fait que nous indiquions la fréquence des ticks 1 ms comme décrit ci-dessus, des quanta de ticks réels seront effectués toutes les 16 (33) -50 ms, et cela déterminera l'erreur maximale possible de la méthode ci-dessus, l'erreur variera dans la plage 0..50 ms de coche à coche, c.-à-d. le taux de répétition des ticks sera moins stable que dans la première méthode, mais la valeur de cette erreur à n'importe quelle distance (même en années) sera la même, c'est-à-dire même après un an, notre prochain tick aura une erreur dans la même gamme par rapport au tout premier tick.
3. Vérification des résultats
Je vais donner un exemple de la façon de vérifier la justice de tout ce qui précède. La source indiquée affichera une fois par seconde le temps actuel écoulé depuis que l'application a été activée pour deux minuteries (séparément) et affichera l'erreur accumulée pendant le fonctionnement.
local timeout = 1000 socket = require "socket" local start_time = socket.gettime()*1000
Bonne chance à tous!