Überschreiben Sie das setTimeout-Verhalten für inaktive Registerkarten

Ich entwickle derzeit ein Peer-to-Peer-Spiel in JavaScript mit WebRTC. Einer der Peers (d. H. Der Host) wird als Server behandelt, und alle anderen Peers, die sich dem Host anschließen, stellen über einen node.js-Vermittlungsserver eine Verbindung zum Host her.

Ich versuche derzeit, ein Problem zu lösen, bei dem das Spiel nicht mehr für alle aktualisiert wird, wenn der Host die Registerkarten wechselt, sodass das Spiel nicht mehr die aktive Registerkarte ist. Nach einigen Recherchen stellte ich fest, dass dies daran liegt, dass ich Folgendes verwende:

setTimeout(callback, 1000 / 60);

in meiner Spieleschleife. setTimeout (zumindest in Chrome und Firefox, den von mir betroffenen Browsern) ist so definiert, dass die aufrufende Seite, wenn sie sich nicht in Ihrem aktiven Tab befindet, maximal einmal pro Sekunde aufgerufen werden kann.

Ich habe gelesen, dass Web Worker diese Einschränkung nicht haben, aber um dies zu ermöglichen, müsste ich meine gesamte Spielelogik im Web Worker ausführen. Ich habe versucht, mein Spielobjekt mithilfe von JSON.stringify () an den Worker zu senden. Es wurde jedoch angegeben, dass das Objekt einen Zirkelverweis (in der Spieleschleife) hatte und nicht in JSON konvertiert werden konnte. Ich bin mir also nicht sicher, was ich dagegen tun soll.

Ich habe auch versucht, einen eigenen Timer zu implementieren, der weiter lief, unabhängig davon, ob sich die Seite im aktiven Tab befand, aber ich bin mir auch nicht sicher, wie ich das machen soll.

Ich habe kein wirkliches Problem damit, es auf diese oder eine andere Weise zu tun, an die ich noch nicht gedacht habe, vorausgesetzt, es verursacht keinen großen Leistungsaufwand. Anregungen wäre sehr dankbar.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage