2015-09-15 12 views
8

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); 
} 
+0

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

+0

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 –

+0

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

Antwort

1

Obwohl ich arbeite nicht mit Spielen, gibt es eine bessere Alternative als setInterval, wie here gezeigt. Es funktionierte gut für mich in einer Geschäftsanwendung. Ich hoffe das hilft.

2

Hier ist ein Artikel über die Erstellung einer accurate node.js game loop mit einer Kombination von setTimeout() und setImmediate so Dinge sind genau, aber nicht zu viel CPU verbrauchen.

Die nanoTimer timing library könnte für Sie arbeiten. Aus der Readme-Datei klingt es, als ob es einen ähnlichen Ansatz verwendet. Ich weiß nicht, ob es mit Spielen entworfen wurde, aber es sollte einen Versuch wert sein!

Verwandte Themen