Stoppuhr mit nicht korrekt addierenden Breakpoints

8

Ich habe eine Hauptstoppuhr mit 4 Mini-Stoppuhren für jeden Schritt. Nach einer fertigen Zeit ist hier ein Beispiel, wie die Timer aussehen sollten:

%Vor%

Die Mini-Timer sollten wie in diesem Fall zum Haupt-Timer addiert werden. Mit meinem aktuellen Timer scheint es immer .02 Millisekunden aus zu sein, also würden sie in diesem Fall 00 : 14 . 55 statt 00 : 14 . 57 addieren.

Hier ist ein JSFiddle meiner aktuellen Timer. Ich denke, das Problem ist höchstwahrscheinlich in der stopwatch.js -Datei, aber ich bin mir nicht sicher, warum das der Fall ist, da ich Date.now() verwende, um zu berechnen, wie viel Zeit vergangen ist. Hier ist die Datei stopwatch.js , die der Code für eine individuelle Stoppuhr ist:

%Vor%

Ich habe alles innerhalb des oben erwähnten JSFiddle und auch in diesem gist , wenn das einfacher zu lesen ist. Jede Anleitung wäre willkommen.

    
saadq 10.07.2016, 01:02
quelle

3 Antworten

5

Sie sprechen von einer Verzögerung von 20 ms, die durch eine Reihe von Dingen verursacht werden kann.

  • Wie Flynn1179 vorgeschlagen hat, gibt es vielleicht zwischen den Aufrufen von Date.now()
  • JavaScript's setInterval driftet! Und hier ist ein Mülleimer, um es zu beweisen . Sie können nicht wirklich erwarten, dass eine Sprache, die auf einem einzigen Thread ausgeführt wird, Aufgaben alle 10ms mit perfekter Genauigkeit plant, und Ihre _update -Methode verlangt genau das.
  • Sie ignorieren die 0-9ms im Centiseconds-Zähler, der im Haupt-Timer berücksichtigt wird. Dies ist wahrscheinlich der größte Faktor. Angenommen, die Miniuhr A ist 15 ms und die Miniuhr B 15 ms. Miniuhr A würde "01" anzeigen, Miniuhr B würde "01" anzeigen, aber die Hauptuhr würde "03" anzeigen, da 30 ms vergangen sind.

Um dies richtig zu lösen, würde ich empfehlen, Ihre Lösung neu zu gestalten, so dass Sie alle Ihre Stoppuhren in eine StopwatchManager umwandeln, die alle Ihre Stoppuhren gleichzeitig rendert und die Gesamtzeit für Ihre Hauptuhr berechnet, indem Sie die Zeiten der hinzufügen Miniuhren. Vielleicht möchten Sie auch mit requestAnimationFrame für das Rendering arbeiten anstatt mit setInterval .

    
fny 13.07.2016, 03:59
quelle
1

Sie stoppen einen Timer und starten in der nächsten Zeile den nächsten. Ihr Problem ist teilweise, dass die Zeit zwischen diesen beiden Methodenaufrufen vergeht.

Auch Ihre 'stop'-Methode verwendet nicht einmal die aktuelle Zeit, sondern stoppt sie nur rückwirkend ab dem letzten Mal, wenn sie aktualisiert wurde, sie macht keine letzte _update .

Wenn Sie möchten, dass es sich genau addiert, nehmen Sie Date.now() in Ihrer updateMiniTimers -Methode und übergeben Sie das an beide Aufrufe, um sicherzustellen, dass sie zum selben Zeitpunkt anhalten / starten und danach eine Endreinigung durchführen a stop call.

Im Allgemeinen innerhalb der Methode:

%Vor%

a und b sind absolut nicht garantiert gleich, kein Methodenaufruf ist augenblicklich.

    
Flynn1179 10.07.2016 01:09
quelle
1

Ich stimme mit Faraz über mögliche Ursachen überein. Ich würde auch nach Rundungsfehlern in den Divisionen suchen. Wie auch immer, wenn Sie es etwas robuster und skalierbarer machen möchten, könnten Sie Ihre Zeitpunkte als Elemente in einer Liste betrachten, die sich ständig erweitert. Immer wenn eine Stoppuhr startet, notieren Sie den Index des letzten Elements in der Liste als Startpunkt. Wenn Sie am Ende sind, zeichnen Sie den Index des letzten Elements als Endpunkt auf. Das würde Ihnen ermöglichen, genaue Hierarchien von Timern zu haben.

    
Milton Hernandez 18.07.2016 16:06
quelle

Tags und Links