Le contexte
Un jeu livré en tant qu'application Web progressive qui dispose de minuteries ( setTimeout
, setInterval
) et de connexions Websocket pour obtenir une communication en temps réel.
Qu'est-ce qui se passe
Tout va bien tant que l'utilisateur reste dans l'application. Mais lorsque l'utilisateur accède à un autre onglet, à une autre application ou éteint l'écran (en cas de mobile), cela devient un "monde inconnu infernal".
- Les Websockets peuvent ou non être "suspendues" ou "désactivées"
- Les minuteries semblent être étranglées ou rebondies.
Ce comportement semble dépendre des navigateurs et de la plate-forme et peut-être même dépendre du comportement particulier de l'utilisateur. Je suppose que les navigateurs et les systèmes d'exploitation ont leur propre cycle de vie / mécanismes pour économiser la batterie et / ou le calcul.
Lorsque l'utilisateur revient, l'application est dans un état inconnu et j'ai du mal à restaurer l'état correctement.
Concernant les websockets, j'ai la reconnexion automatique avec socket.io et reconnecting-websocket mais ce n'est pas suffisant pour tout résoudre.
Recherche de réponses
- Quels sont les "cycles de vie" des différents navigateurs les concernant? Est-ce documenté? Quand décident-ils de s'éteindre et d'accélérer?
- Que font-ils exactement aux websockets? Les navigateurs les déconnectent simplement?
- Que font-ils exactement aux chronomètres? Ils les étranglent ou les rebondissent ou autre chose?
- Qu'advient-il de l'exécution javascript en général? En pause / détruit / étranglé?
- Existe-t-il un moyen de se connecter à une sorte d'événement de cycle de vie du navigateur quand il va éteindre les choses? La seule chose que j'ai pu trouver pourrait être l' API de visibilité
Existe-t-il un moyen de reproduire artificiellement ce comportement pour pouvoir tester des solutions? C'est particulièrement difficile sur le bureau. Les Websockets ne peuvent pas être désactivées et les développeurs de chrome ne semblent pas pressés de résoudre un problème de 2014 (!): Les Websockets ne sont pas incluses lors de l'utilisation de la limitation de connexion
Indépendamment de ce qui précède, existe-t-il une solution pragmatique multi-navigateur pour détecter / résoudre ce problème? (par exemple, par expérience, Firefox sur le bureau semble se comporter complètement différemment de Chrome, et un iPhone se déconnectera beaucoup plus souvent qu'un Android)
Liens connexes