Kontext
Ein Spiel, das als progressive Web-App ausgeliefert wird und über Timer ( setTimeout
, setInterval
) und Websocket-Verbindungen verfügt, um Echtzeitkommunikation zu erhalten.
Was ist los
Alles ist in Ordnung, solange der Benutzer in der App bleibt. Wenn der Benutzer jedoch zu einem anderen Tab oder einer anderen App wechselt oder den Bildschirm ausschaltet (im Falle eines Mobilgeräts), wird dies zu einer "höllisch unbekannten Welt".
- Websockets können "angehalten" oder "ausgeschaltet" werden oder nicht.
- Timer sehen aus, als würden sie gedrosselt oder entprellt.
Dieses Verhalten scheint von Browsern und Plattformen abzuhängen und möglicherweise sogar vom jeweiligen Benutzerverhalten. Ich denke, Browser und Betriebssystem haben ihren eigenen Lebenszyklus / ihre eigenen Mechanismen, um Batterie und / oder Berechnung zu sparen.
Wenn der Benutzer zurückkommt, befindet sich die App in einem unbekannten Zustand und ich habe Probleme, den Zustand ordnungsgemäß wiederherzustellen.
In Bezug auf WebSockets Ich habe Auto-Wiederverbindung mit socket.io und wieder anschließen-websocket aber es ist nicht genug , um alles zu lösen.
Nach Antworten suchen
- Was sind die "Lebenszyklen" der verschiedenen Browser in Bezug auf diese? Ist das dokumentiert? Wann entscheiden sie sich auszuschalten und zu drosseln?
- Was machen sie genau mit Websockets? Browser trennen sie einfach?
- Was machen sie genau mit Timern? Sie drosseln sie oder entprellen sie oder etwas anderes?
- Was passiert mit der Ausführung von Javascript im Allgemeinen? Angehalten / zerstört / gedrosselt?
- Gibt es eine Möglichkeit, sich in eine Art Browser-Lebenszyklusereignis einzubinden, wenn es die Dinge ausschaltet? Das einzige, was ich finden konnte, war möglicherweise die Sichtbarkeits-API
Gibt es eine Möglichkeit, dieses Verhalten künstlich zu reproduzieren, um Lösungen testen zu können? Es ist besonders schwer auf dem Desktop. Websockets können nicht deaktiviert werden, und Chromentwickler scheinen es nicht eilig zu haben, ein Problem aus dem Jahr 2014 (!) Zu beheben: Websockets sind bei Verwendung der Verbindungsdrosselung nicht enthalten
Gibt es unabhängig davon eine pragmatische browserübergreifende Lösung, um dieses Problem zu erkennen / zu lösen? (Zum Beispiel scheint sich Firefox auf dem Desktop aus Erfahrung völlig anders zu verhalten als Chrome, und ein iPhone trennt die Verbindung weitaus häufiger als ein Android-Gerät.)
verwandte Links