2017-05-18 1 views
0

Pourquoi cette instruction fonctionne-t-elle? J'essaye de mettre à jour mon écran à 20-25 images par seconde. Je comprends pourquoi cela fonctionne, je ne comprends tout simplement pas comment cela fonctionne. Si nous prenons new Date(). GetTime() - lastLoopRun, pourquoi le résultat n'est pas zéro à chaque fois que lastLoopRun est égal à new Date(). GetTime()? Je sais que cela a quelque chose à voir avec le fait que la variable commence à 0 mais cela n'a pas beaucoup de sens pour moi.Comment fonctionne .getTime()?

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

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

parce que l'heure change et elle n'est mise à jour que lorsqu'elle entre dans le if. – epascarello

Répondre

0

Lorsque lastLoopRun est cochée, il n'a pas été mis à jour à l'heure actuelle encore.

Ainsi, au début de la boucle, il reste soit a son ancienne valeur de la boucle précédente, ou 0.

Si elle était mise à jour au début de la boucle, il serait toujours 0 comme vous avez dit .

+0

hmmm ok cela signifierait que new Date(). GetTime() commence au début de la boucle et est influencé par la méthode setTImeout. Correct? –

+0

Ignorer setTimeout pour l'instant, il appelle juste la boucle à nouveau dans 2 secondes. 'getTime()' renvoie toujours l'heure actuelle, mais au début de la boucle, 'lastLoopRun' n'est pas défini sur l'heure actuelle. Il est réglé sur l'heure à laquelle la boucle précédente s'est terminée. C'est pourquoi la soustraire de l'heure actuelle ne vous donne pas 0. –

+0

D'accord désolé de déranger à nouveau, mais je veux juste m'assurer que je comprends bien. Ainsi, dans l'instruction if, new Date(). GetTime() est soustraite par 0 parce que var lastLoopRun = 0. Cela fera toujours que cette instruction if est supérieure à 40. Ensuite, lastLoopRun est en cours de mise à jour et crée un différence de temps. –

0

new Date().getTime() renvoie les millisecondes écoulées entre le 1er janvier 1970 00:00:00 UTC et l'heure actuelle. Donc, il est augmenté de 1000 pour chaque seconde.

function loop() { ...; setTimeout('loop();', 2);} appelle loop() pour toutes les 2 millisecondes.

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 
-> ...