Ich entwickle ein 2D-HTML5-Canvas-Spiel und versuche, den effizientesten Weg zu finden, um eine Physikschleife auf dem Server zu implementieren, indem NodeJS und Socket.IO ausgeführt werden.
Die einzige Methode, an die ich gedacht habe, ist die Verwendung setTimeout/Interval
. Gibt es einen besseren Weg? Alle Beispiele wäre dankbar.
EDIT: Das Spiel ist ein Top-Down-Spiel, wie Zelda und ältere Pokemon-Spiele. Der größte Teil der in der Schleife durchgeführten Physik besteht aus einfachen Schnittpunkten.
Antworten:
Ich glaube, es
setTimeout
ist gut genug für Ihre Bedürfnisse. Ich selbst stehe vor einer ähnlichen Situation und gehe mitsetTimeout
. Dieser großartige Artikel über BNG hat mir geholfen, besser zu verstehen, was ich tun (oder zumindest versuchen) muss: Echtzeit-Multiplayer in HTML5 .Über den Link: Es geht hauptsächlich um die mehreren Spielschleifen und deren Vernetzung. Es ist ziemlich cool. Unten ein Auszug.
Es ist eine sehr empfehlenswerte Lektüre. Zumindest von mir. = P.
quelle
Für serverseitige Inhalte haben Sie mehrere Optionen. Die erste besteht darin, alle Ihre Kollisionen vollständig zu extrapolieren, wobei davon ausgegangen wird, dass Sie häufig genug Nachrichten von Clients erhalten, und alle wichtigen Statusänderungen über den Server zu kommunizieren, der dann nur dann eine Validierung für Spielereignisse ausführt, wenn E / A-Rückrufe von der empfangen werden Client-Verbindungen.
Die zweite Möglichkeit, die Sie zu bevorzugen scheinen, besteht darin, eine eigene Schleife auszuführen, während Sie E / A-Rückrufe verarbeiten. Obwohl setInterval und setTimeout dies erreichen, verfügen Sie über eine viel feinere Reihe von Tools, um dies zu steuern:
setImmediate(callbacks, [[arg], ...])
undprocess.nextTick(callback)
.Process.nextTick führt Ihren Rückruf vor anderen E / A- Ereignissen aus, solange Sie keinen rekursiv unendlichen Stapel von Rückrufen gestapelt haben (wenn er eine bestimmte Anzahl überschreitet, process.maxTickDepth, gibt er den E / A-Rückrufen nach).
SetImmediateCallback ähnelt process.nextTick dahingehend , dass es jeden Tick ausführt, aber nur einer der Rückrufe in der Warteschlange bei jedem Tick ausgeführt wird und nicht alle Rückrufe in der Warteschlange.
Die Verwendung dieser Elemente ähnelt setTimeout oder requestAnimationFrame.
Dies hat den Vorteil, dass Sie nicht von der Implementierung von setTimeout und setInterval in V8 abhängig sind. Dies ist eher eine direkte Verbindung zur Ereignisschleife des Knotens. Stellen Sie nur sicher, dass Sie die E / A nicht verhungern lassen, wenn Sie process.nextTick verwenden. updateCollisions sollte garantiert nicht so lange dauern.
quelle