2017-05-18 4 views
0

この声明はなぜ機能しますか?私は毎秒20-25フレームで画面を更新しようとしています。なぜ私はこれが動作するのか理解しています。新しいDate()。getTime() - lastLoopRunを使用すると、lastLoopRunがnew Date()。getTime()と等しいため、結果が毎回ゼロでないのはなぜですか?私は変数が0から始まるという事実と関係があると知っていますが、それは私にはあまり意味がありません。.getTime()はどのように機能しますか?

var lastLoopRun = 0; 
function loop() { 
     if (new Date().getTime() - lastLoopRun > 40) { 
      handleControls(); 
      showSPrites(); 

      lastLoopRun = new Date().getTime(); 
     } 
     setTimeout('loop();', 2); 
    } 
+1

時間が変化し、ifに入ると更新されるだけであるためです。 – epascarello

答えて

0

lastLoopRunをチェックすると、それはまだ現在の時刻に更新されていません。それは、ループの先頭で更新された場合、あなたが言ったよう

だから、ループの最初で、それはまだ前のループからその古い値を持っている、または0

のいずれか、それは常に0になります。

+0

hmmm okこれは、新しいDate()。getTime()がループの開始時に始まり、setTImeoutメソッドの影響を受けることを意味します。正しい? –

+0

setTimeoutを無視して、ループを2秒後にもう一度呼び出すだけです。 'getTime()'は常に現在の時刻を返しますが、ループの開始時に 'lastLoopRun'は現在の時刻に設定されません。前のループが終了した時刻に設定されます。だから今の時間からそれを引いても0は得られません。 –

+0

申し訳ありませんもう一度迷惑をかけて申し訳ありませんが、私はこれをまっすぐにしています。したがって、ifステートメントでは、var DateLoopRun = 0なので、new Date()。getTime()は0から減算されています。これは、常にif文が40より大きいためです。次にlastLoopRunが現在の時刻に更新され、時差。 –

0

new Date().getTime()は、1970年1月1日00:00:00 UTCから現在の時刻までの経過時間をミリ秒で返します。したがって、1秒ごとに1000ずつ増加します。

function loop() { ...; setTimeout('loop();', 2);}は、2ミリ秒ごとにloop()を呼び出します。

loop() -> elapsed about 40 ms after previous action? -> after 2 ms 
-> loop() -> elapsed about 40 ms after previous action? -> after 2 ms 
-> loop() -> elapsed about 40 ms after previous action? -> after 2 ms 
-> loop() -> OK! elapsed -> do action -> update timestamp -> after 2 ms 
-> loop() -> elapsed about 40 ms after previous action? -> after 2 ms 
-> ... 
関連する問題