Je testais l'exactitude de l' setTimeout
utilisation de ce test . Maintenant, j'ai remarqué que (comme prévu) ce setTimeout
n'est pas très précis, mais pour la plupart des appareils pas très inexact. Maintenant, si j'exécute le test dans Chrome et que je le laisse s'exécuter dans un onglet d'arrière-plan (donc, passer à un autre onglet et y naviguer), revenir au test et inspecter les résultats (si le test est terminé), ils sont considérablement modifiés. Il semble que les délais d'attente aient été beaucoup plus lents. Testé dans FF4 ou IE9, cela ne s'est pas produit.
Il semble donc que Chrome suspende ou au moins ralentisse l'exécution de JavaScript dans un onglet sans focus. Impossible de trouver grand-chose sur le net sur le sujet. Cela signifierait que nous ne pouvons pas exécuter de tâches en arrière-plan, comme par exemple la vérification périodique sur un serveur utilisant des appels XHR et setInterval
(je soupçonne de voir le même comportement pour setInterval
, écrira un test si le temps est avec moi).
Quelqu'un at-il rencontré cela? Y aurait-il une solution de contournement pour cette suspension / ralentissement? Appelleriez-vous cela un bogue et devrais-je le déclarer comme tel?
la source
transition
, donc pas toutes les divs transitions en même temps, mais en fait 15ms après l'autre, créant un effet de roulement. Lorsque je vais dans un autre onglet et que je reviens après un certain temps, toutes les divs font la transition en même temps et lesetTimeOut
est complètement ignoré. Ce n'est pas un gros problème pour mon projet, mais c'est un ajout étrange et indésirable.Réponses:
J'ai récemment posé une question à ce sujet et c'est le comportement par conception. Lorsqu'un onglet est inactif, la fonction est appelée au maximum une fois par seconde. Voici le changement de code .
Peut-être que cela aidera: Comment puis-je faire en sorte que setInterval fonctionne également lorsqu'un onglet est inactif dans Chrome?
TL; DR: utilisez Web Workers .
la source
Il existe une solution pour utiliser les Web Workers, car ils s'exécutent dans un processus séparé et ne sont pas ralentis
J'ai écrit un petit script qui peut être utilisé sans modification de votre code - il remplace simplement les fonctions setTimeout, clearTimeout, setInterval, clearInterval
Incluez-le juste avant tout votre code
http://github.com/turuslan/HackTimer
la source
new Worker('data:text/javascript,(' + function myWorkerCode () { /*...*/ } + '()')
. C'est aussi un bon moyen de vérifier si vous avez le support des expressions d'importation:try { eval('import("data:text/javascript,void 0")') } catch (e) { /* no support! */ }
Jouer un son ~ vide oblige le navigateur à conserver les performances - je l'ai découvert après avoir lu ce commentaire: Comment faire fonctionner JavaScript à vitesse normale dans Chrome même lorsque l'onglet n'est pas actif?
J'ai besoin de performances illimitées à la demande pour un jeu par navigateur qui utilise WebSockets, donc je sais par expérience que l'utilisation de WebSockets ne garantit pas des performances illimitées, mais d'après les tests, la lecture d'un fichier audio semble le garantir.
Voici 2 boucles audio vides que j'ai créées à cet effet, vous pouvez les utiliser librement, commercialement: http://adventure.land/sounds/loops/empty_loop_for_js_performance.ogg http://adventure.land/sounds/loops/empty_loop_for_js_performance.wav
(Ils incluent un bruit de -58 dB, -60 dB ne fonctionne pas)
Je les joue, à la demande des utilisateurs, avec Howler.js: https://github.com/goldfire/howler.js
Il est triste qu'il n'y ait pas de méthode intégrée pour activer / désactiver les performances JavaScript complètes par défaut, mais les crypto-mineurs peuvent détourner tous vos threads informatiques à l'aide de Web Workers sans aucune invite: |
la source
J'ai publié le package npm à intervalle de travail qui implémente setInterval et clearInterval avec l'utilisation de Web-Workers pour rester opérationnel sur les onglets inactifs pour Chrome, Firefox et IE.
La plupart des navigateurs modernes (Chrome, Firefox et IE), les intervalles (minuteries de fenêtre) sont fixés pour ne pas se déclencher plus d'une fois par seconde dans les onglets inactifs.
Vous pouvez trouver plus d'informations sur
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval
https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#Timeouts_and_intervals
la source
J'ai mis à jour mon noyau jQuery vers la version 1.9.1 et cela a résolu la différence d'intervalle dans les onglets inactifs. J'essaierais d'abord cela, puis j'examinerais d'autres options de remplacement de code.
la source
voici ma solution qui obtient la milliseconde actuelle, et la compare à la milliseconde que la fonction a été créée. pour l'intervalle, il mettra à jour la milliseconde lorsqu'il exécutera la fonction. vous pouvez également saisir l'intervalle / le délai d'expiration par un identifiant.
la source