2012-07-10 8 views
5

In meiner Game-Engine gibt es Objekte, die regelmäßig aktualisiert werden müssen. Zum Beispiel kann eine Szene ihr Alpha absenken, also stelle ich ein Intervall ein, das das tut. Außerdem muss die Kamera manchmal etwas wackeln, was eine Interpolation der Rotationseigenschaft erfordert.Aufrufen von Update-Methode vs mit einem SetInterval

Ich sehe, dass es zwei Möglichkeiten, um mit diesen Problemen umzugehen:

  1. haben ein Update() -Methode, die alle anderen Objektmethoden Update aufruft. Die Objekte verfolgen die Zeit seit ihrer letzten Aktualisierung und agieren entsprechend.

  2. Führen Sie eine setInterval für die Update-Methode jedes Objekts.

Was ist die beste Lösung und warum?

+1

Ich bin nicht qualifiziert zu antworten, aber die meisten Beispiele, die ich gesehen habe, scheinen Option 1 zu bevorzugen. Auf diese Weise werden alle Objekte gegen den gleichen Spielzeitwert aktualisiert. Scheint, wenn jedes Objekt sein eigenes Intervall hat, könnten die Dinge "nicht mehr synchron sein", wenn das Sinn macht. – sellmeadog

+0

Was genau ist der Unterschied zwischen diesen Möglichkeiten? In jedem Fall muss der Motor die Zeit verfolgen. – Bergi

+0

+1 @sellmeadog. Definitiv mit Option 1 gehen. –

Antwort

4

setInterval hält sich nicht an eine Uhr, es zeichnet nur Ereignisse auf, wie sie hereinkommen. Browser neigen dazu, zwischen den Ereignissen wenigstens etwas Zeit zu behalten. Also, wenn Sie 10 Ereignisse haben, die alle nach 100ms feuern müssen, werden Sie wahrscheinlich das letzte Ereignis gut in die 200ms schießen sehen. (Dies ist einfach genug zu testen).

nur ein Ereignis Mit (und für alle Objekte Update Aufruf) ist in diesem Sinne besser als jedes Objekt mit gesetzt sein eigenes Intervall ist. Es mag andere Überlegungen geben, aber zumindest aus diesem Grund ist Option 2 nicht durchführbar.

hier etwas mehr über setIntervalHow do browsers determine what time setInterval should use?

1

Der beste Weg, die ich gefunden habe, um eine gute Funktion Update() zu machen und eine gute Frameraten und weniger Belastung ist wie folgt zu halten.

Haben Sie eine einzige update() Methode, die Ihren Rahmen zeichnet, indem Sie irgendeine Art von Warteschlange/Zeitplan aller Zeichenobjekt seine eigene update() Funktion, die diese Update-Ereigniswarteschlange/Zeitplan hinzugefügt werden. (eventlistener)

Auf diese Weise müssen Sie nicht alle Objekte, die nicht für ein Neuzeichnen/Aktualisieren geplant sind (wie Menüschaltflächen oder Fadenkreuze), in eine Schleife einfügen. Und Sie haben nicht übermäßig viele Intervalle für alle Zeichenobjekte.

0

Ich empfehle die Verwendung der update() Methode über die setInterval.

Auch ich würde vermuten, dass das Timing auf den verschiedenen intervalmsintermationen unzuverlässig wäre.

Eine weitere Möglichkeit, je nachdem, was andere Dinge in Ihrem Spiel passieren, ein Bündel von separaten Intervallen mit Rennbedingungen bei der Auszählung einführen könnte und von Scoring-Vergleich usw.

+0

Erraten Sie nicht, Timing mit setInterval/Timeout * ist * unzuverlässig. – Bergi

0

Die vorgeschlagenen Algorithmen sind vorgeschlagen nicht exklusiv für die verwandte Methode. Das heißt, Sie können setInteval verwenden, um alle Aktualisierungsmethoden aufzurufen, oder Sie können jedes Objekt selbst aktualisieren, indem Sie setTimeout wiederholt aufrufen.

Mehr zu dem Punkt ist, dass ein einzelner Timer weniger Overhead als mehrere Timer (von jedem Typ) ist. Das ist wirklich wichtig, wenn Sie viele Timer haben. Auf der anderen Seite ist möglicherweise nur ein Timer nicht geeignet, da einige Objekte möglicherweise häufiger aktualisiert werden müssen als andere oder zu einem anderen Zeitplan. Versuchen Sie also, diese zu minimieren.

Ein Vorteil von setTimeout besteht darin, dass das Intervall zum nächsten Anruf angepasst werden kann, um spezielle Zeitplanungsanforderungen zu erfüllen, z. Wenn man sich verspätet, kann man das nächste überspringen oder es früher machen. setInterval wird langsam relativ zu einer konsistenten Uhr driften und eine der Einstellungen ist schwieriger.

Auf der anderen Seite muss setInteval nur einmal aufgerufen werden, so dass Sie den Timer nicht weiter aufrufen müssen. Sie können mit einer Kombination enden.