Mein Setup ist ein Multiplayer-Spiel, mit Sockets zu asynchronen Übertragungsdaten.Node.js: Alternative zu setInterval, die für Spielschleife genauer ist
Jetzt wegen der Natur eines Spiels, ich habe eine Spielschleife, die alle 500ms ankreuzen sollte, um Spieleraktualisierung zu machen (z. B. Position, Aussehen, ...).
var self = this;
this.gameLoop = setInterval(function()
{
for (var i = 0; i < playerSize; i++)
{
self.players.get(i).update();
};
}, 500);
verwende ich zur Zeit setInterval
, aber wenn ich mit etwa 200 Verbindungen einige Benchmarks haben, setInterval
driftete statt 500 ms, bis 1000 ms, die das ganze Spiel laggy erscheinen lässt. Auch ist es leider nicht genau genug mit einer kleinen Anzahl von Spielern. (Beachten Sie, dass die Update-Aufrufe nur etwa 100ms dauern)
Also nach mir scheint es keine andere Möglichkeit zu geben, einen Prozess zu generieren, der nur den Timing-Mechanismus behandelt? Oder gibt es andere Möglichkeiten?
Jeder hat das schon einmal gemacht oder kann einige grundlegende Ideen/Lösungen dazu geben?
Voll Code:
Game.prototype.start = function()
{
var average = 0;
var cycles = 10;
var prev = Date.now();
this.thread = setInterval(function()
{
console.log("interval time="+(Date.now() - prev));
prev = Date.now();
var s = Date.now();
// EXECUTE UPDATES
for (var i = 0; i < playerSize; i++)
{
self.players.get(i).update();
};
average += (Date.now() - s);
cycles--;
if(cycles == 0)
{
console.log("average update time: " + (average/10) + "ms");
average = 0;
cycles = 10;
}
}, 500);
}
Sie sagten 'update()' dauert nur etwa 100ms. Wie haben Sie das gemessen? Und bedeutet das, dass die ganze Schleife mit 200 Spielern nur 100ms dauert oder ein einzelner Aufruf von 'update' 100ms dauert? – basilikum
Hallo, alle Updates der Spieler dauert weniger als 100ms, mein Punkt war nur zu beachten, dass es nicht mehr als die Intervallzeit ist. Ich habe es mit einem Date.now() Unterschied gemessen –
Können Sie vielleicht im Code zeigen, wie Sie es gemessen haben? Ich bin nicht sicher, aber angesichts dieser großen Unterschiede (von 500ms bis 1000ms) würde ich annehmen, dass der Benchmark vielleicht inkorrekt ist und dass Ihre Schleife tatsächlich mehr Zeit als 500ms benötigt, wodurch die Intervalle länger werden und sich möglicherweise überlappen. – basilikum