Autor: Eric Burgess
Übersetzt von: Sven Lohmann
Mit freundlicher Genehmigung von: Eric Burgess
Level: Fortgeschritten
Ein Multiplayer Spiel zu schreiben ist eine Herausforderung. Dem Spiel eine gute Performance zu geben eine noch größere. Dies ist eine Liste mit Empfehlungen, um die beste Performance aus deinem Spiel herauszuholen.
Pausiere niemals das gesamte Spiel
Dein Spiel muss immer nach ankommenden Paketen suchen, und diese verarbeiten. Vergewissere dich, dass die Option „freeze the game when the form loses focus“ nicht aktiviert ist. Immer wenn du das Spiel stoppst, achte auf ankommende Pakete, diese häufen sich und behindern den Kanal. Das verursacht eine Verzögerung.
Verschicke so wenig Pakete wie möglich
Ein Paket zu verschicken dauert lange. Verknüpfe so viele Daten wie möglich zu einem Paket zusammen. Versende nicht für eine Instance Separate x-, y- Koordinaten, direction, sprite_index, Waffendaten, etc. sondern stopfe sie in einen String wie diesen:
--------------------------------------------------------
120|338|-2.1|0.4|201|f|k|549749
--------------------------------------------------------
dann verschicke den codierten String. Es ist immer schneller ein Paket auf dieser Weise zu codieren und decodieren, als separate Daten zu senden.
Das bedeutet aber auch, ein Paket nicht bei jedem Stepp zu versenden, das sind eindeutig zu viele Nachrichten. Eine Faustregel ist, für jeden Spieler 4 Pakete pro Sekunde bei Internet-spielen, 6-8 Pakete, wenn jeder eine schnelle Verbindung besitzt, und 10-15 bei einem LAN Spiel zu versenden.
Mache jedes Paket so klein wie möglich
Sende nur die Informationen die du senden musst. Das muss reichen.
Fortgeschrittene Verbindungsüberwachungen
Der Script ,der die zu versendeten Paketmengen überwacht, sollte allgemein arbeiten, du kannst aber deinem Spiel erlauben ,diese Verbindung zu überwachen, und mehr Pakete zu schicken wenn sie gut ist, und weniger Pakete wenn sie schlecht ist. Um das zu tun, muss der Host den ping überwachen, oder die Zeit einer Nachrichtenrundsendung für jeden Spieler wissen.
Das erste, was du wissen musst, wenn du diese benutzt ist, dass der Client Computer nur auf Pakete des Host antwortet. Siehst du die letzte Nummer am Ende des Beispielpaketes oben? Das zeigt die current_time Variable (Millisekunden seit Systemstart) des Hosts zu der Zeit, als das Paket gesendet wurde. Jedes mal wenn der Host ein Paket sendet, fügt er die Systemzeit am Ende zu. Wenn ein Client ein Paket erhält, nimmt er diesen Zeitstempel und fügt dem rücksendenden Paket die eigenen Daten hinzu.
Wenn nun das Clienten Paket zum Host zurückkommt, subtrahiert der Host einfach den Zeitstempel der vergangenen Zeit, um herauszufinden, wie lange die Sendung brauchte. Wenn der langsamste Spieler eine Rundsendungszeit von 200ms hat, dann kann der Host ihm alle 200ms ein Paket schicken (5pro Sekunde). Wenn jeder Spieler eine gute, schnelle Verbindung hat, und der langsamste ping 75ms beträgt, dann kann der Host 13 Pakete pro Sekunde. senden.
Die gute Sache an dieser Methode ist, das der Client Computer keine Daten sendet, solange der Host nicht danach fragt, und so kann der Kanal nie überladen werden.
Bewegungs- Vorraussagen
4 Pakete pro Sekunde?!? Wird das nicht schrecklich ruckelig? Ja, würde es, wenn du nicht mehr tust, als das Spieler Objekt an einen bestimmten Punkt zu bewegen, und es dort lässt, bis das nächste Paket eintrifft und es dann abrupt zum nächsten Punkt bewegst. Was du brauchst, wenn du die Rate der Sendungen verringerst, ist eine Voraussage, wie die nächste Bewegung des Objektes wohl aussehen würde, und es schon in diese Richtung bewegen. Subtrahiere einfach die vorherige Position von der aktuellen, und dividiere sie durch die vergangene Zeit, und du bekommst den speed. Dann lass das Objekt kontinuierlich diese Geschwindigkeit beibehalten, bis das nächste Paket eintrifft. Oft wirst du die Menge der vorrausgesagten Bewegungen leicht reduzieren wollen, um ein besseres Ergebnis zu bekommen.
Du kannst natürlich auch den hspeed und vspeed in jedem Paket senden, doch es ist besser, diese mit einem Code zu berechnen, weil eine kleinere Paketgröße bedeutet, dass du mehr Pakete pro Sekunde senden kannst. Natürlich ist das abhängig von der Art des Spieles, das du hast, manchmal ist es vielleicht besser, den speed in einem Paket zu haben.
Probier es aus.
Original:
Übersetzt von: Sven Lohmann
Mit freundlicher Genehmigung von: Eric Burgess
Level: Fortgeschritten
Ein Multiplayer Spiel zu schreiben ist eine Herausforderung. Dem Spiel eine gute Performance zu geben eine noch größere. Dies ist eine Liste mit Empfehlungen, um die beste Performance aus deinem Spiel herauszuholen.
Pausiere niemals das gesamte Spiel
Dein Spiel muss immer nach ankommenden Paketen suchen, und diese verarbeiten. Vergewissere dich, dass die Option „freeze the game when the form loses focus“ nicht aktiviert ist. Immer wenn du das Spiel stoppst, achte auf ankommende Pakete, diese häufen sich und behindern den Kanal. Das verursacht eine Verzögerung.
Verschicke so wenig Pakete wie möglich
Ein Paket zu verschicken dauert lange. Verknüpfe so viele Daten wie möglich zu einem Paket zusammen. Versende nicht für eine Instance Separate x-, y- Koordinaten, direction, sprite_index, Waffendaten, etc. sondern stopfe sie in einen String wie diesen:
--------------------------------------------------------
120|338|-2.1|0.4|201|f|k|549749
--------------------------------------------------------
dann verschicke den codierten String. Es ist immer schneller ein Paket auf dieser Weise zu codieren und decodieren, als separate Daten zu senden.
Das bedeutet aber auch, ein Paket nicht bei jedem Stepp zu versenden, das sind eindeutig zu viele Nachrichten. Eine Faustregel ist, für jeden Spieler 4 Pakete pro Sekunde bei Internet-spielen, 6-8 Pakete, wenn jeder eine schnelle Verbindung besitzt, und 10-15 bei einem LAN Spiel zu versenden.
Mache jedes Paket so klein wie möglich
Sende nur die Informationen die du senden musst. Das muss reichen.
Fortgeschrittene Verbindungsüberwachungen
Der Script ,der die zu versendeten Paketmengen überwacht, sollte allgemein arbeiten, du kannst aber deinem Spiel erlauben ,diese Verbindung zu überwachen, und mehr Pakete zu schicken wenn sie gut ist, und weniger Pakete wenn sie schlecht ist. Um das zu tun, muss der Host den ping überwachen, oder die Zeit einer Nachrichtenrundsendung für jeden Spieler wissen.
Das erste, was du wissen musst, wenn du diese benutzt ist, dass der Client Computer nur auf Pakete des Host antwortet. Siehst du die letzte Nummer am Ende des Beispielpaketes oben? Das zeigt die current_time Variable (Millisekunden seit Systemstart) des Hosts zu der Zeit, als das Paket gesendet wurde. Jedes mal wenn der Host ein Paket sendet, fügt er die Systemzeit am Ende zu. Wenn ein Client ein Paket erhält, nimmt er diesen Zeitstempel und fügt dem rücksendenden Paket die eigenen Daten hinzu.
Wenn nun das Clienten Paket zum Host zurückkommt, subtrahiert der Host einfach den Zeitstempel der vergangenen Zeit, um herauszufinden, wie lange die Sendung brauchte. Wenn der langsamste Spieler eine Rundsendungszeit von 200ms hat, dann kann der Host ihm alle 200ms ein Paket schicken (5pro Sekunde). Wenn jeder Spieler eine gute, schnelle Verbindung hat, und der langsamste ping 75ms beträgt, dann kann der Host 13 Pakete pro Sekunde. senden.
Die gute Sache an dieser Methode ist, das der Client Computer keine Daten sendet, solange der Host nicht danach fragt, und so kann der Kanal nie überladen werden.
Bewegungs- Vorraussagen
4 Pakete pro Sekunde?!? Wird das nicht schrecklich ruckelig? Ja, würde es, wenn du nicht mehr tust, als das Spieler Objekt an einen bestimmten Punkt zu bewegen, und es dort lässt, bis das nächste Paket eintrifft und es dann abrupt zum nächsten Punkt bewegst. Was du brauchst, wenn du die Rate der Sendungen verringerst, ist eine Voraussage, wie die nächste Bewegung des Objektes wohl aussehen würde, und es schon in diese Richtung bewegen. Subtrahiere einfach die vorherige Position von der aktuellen, und dividiere sie durch die vergangene Zeit, und du bekommst den speed. Dann lass das Objekt kontinuierlich diese Geschwindigkeit beibehalten, bis das nächste Paket eintrifft. Oft wirst du die Menge der vorrausgesagten Bewegungen leicht reduzieren wollen, um ein besseres Ergebnis zu bekommen.
Du kannst natürlich auch den hspeed und vspeed in jedem Paket senden, doch es ist besser, diese mit einem Code zu berechnen, weil eine kleinere Paketgröße bedeutet, dass du mehr Pakete pro Sekunde senden kannst. Natürlich ist das abhängig von der Art des Spieles, das du hast, manchmal ist es vielleicht besser, den speed in einem Paket zu haben.
Probier es aus.
Original:

"Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl