Hallo an alle. In diesem kurzen Artikel werde ich Ihnen erklären, wie Sie einen Timer in Ihrer Anwendung auf dem Corona SDK mit einem akzeptablen Indikator für die Lesegenauigkeit erstellen. Berücksichtigen Sie auch die Probleme des Standard-Timers.
Das folgende Problem wird im Artikel behoben: So erstellen Sie eine Anwendung, die die seit dem Einschalten der Anwendung verstrichene Zeit mit dem Update 1 Mal pro Sekunde anzeigt.
1. Die offensichtliche Standardlösung.
Erstellen Sie einen Standard-Timer und zeigen Sie seine Häkchen an.
timeout = 1000 timer.performWithDelay( timeout,function(event) print(event.count) end,0)
Alles scheint offensichtlich zu sein, aber es gibt Funktionen in der Arbeit dieser Lösung:
- Erstens kann der Standard-Timer Zeitüberschreitungen von 300 bis 400 ms korrekt und ziemlich genau berechnen, und alles, was unter diesem Wert liegt, beginnt sehr stark zu verzögern, aber unser Fall ist anders, da die Zeitüberschreitung über den angegebenen Grenzwerten liegt. Die minimal mögliche Tick-Periode des Timers (wenn Sie 1 ms angeben) beträgt 1 / fps, d. H. 16. (6) ms für 60 Bilder oder 33. (3) ms für 30 Bilder.
- Zweitens gibt es selbst bei der angegebenen relativ genauen Periode einen zufälligen Fehler von ungefähr 5 bis 10 ms von jedem Tick, d.h. In einer Stunde tritt ein Fehler von 15 bis 30 Sekunden auf. Dieses Problem kann teilweise gelöst werden, indem 5 ms von dem Wert subtrahiert werden, der im Parameter beim Erstellen des Timers angegeben ist, d. H. anstelle von 1000 geben Sie 995 an.
- Drittens, wenn in Ihrer Anwendung kleine Friese auftreten, die durch das Ergebnis eines anderen Codes oder den instabilen Betrieb des Geräts verursacht werden, werden diese Friese auch zum Rückstand des Timers hinzugefügt.
- Viertens: Wenn Sie die Anwendung für einige Zeit minimieren und dann erneut bereitstellen, wird die gesamte Zeit, in der die Anwendung minimiert wurde, von der Anzahl der Sekunden ausgeschlossen, in denen die Anwendung ausgeführt wurde.
2. Eine gute Entscheidung.
Um die Probleme der vorherigen Methode zu lösen, verwenden wir das folgende Design. Bei dieser Methode verwenden wir einen Timer mit der höchstmöglichen Geschwindigkeit. Das Signal für den Tick-Timer ist jedoch eine Berechnung, die auf der Quelle der genauen Zeit des Systems basiert.
local timeout = 1000
Wir analysieren die Merkmale dieser Methode. Trotz der Tatsache, dass wir wie oben beschrieben eine Tick-Frequenz von 1 ms angeben, werden alle 16 (33) -50 ms echte Tick-Quanten durchgeführt, und dies bestimmt den maximal möglichen Fehler der obigen Methode. Der Fehler variiert im Bereich von 0 bis 50 ms ab tick to tick, d.h. Die Zeckenwiederholungsrate ist weniger stabil als bei der ersten Methode, aber der Wert dieses Fehlers in jeder Entfernung (sogar in Jahren) ist der gleiche, d. h. Selbst nach einem Jahr weist unser nächster Tick einen Fehler im gleichen Bereich wie der allererste Tick auf.
3. Überprüfung der Ergebnisse
Ich werde ein Beispiel geben, wie die Gerechtigkeit all dieser Punkte überprüft werden kann. Die angegebene Quelle zeigt einmal pro Sekunde die aktuelle Zeit an, die seit dem Einschalten der Anwendung für zwei Timer (separat) vergangen ist, und zeigt den während des Betriebs akkumulierten Fehler an.
local timeout = 1000 socket = require "socket" local start_time = socket.gettime()*1000
Viel Glück an alle!