Ich versuche, eine Architektur für ein MMO-Spiel zu machen, und ich kann nicht herausfinden, wie ich so viele Variablen in GameObjects speichern kann, ohne viele Anrufe zu haben schicke sie zur gleichen Zeit auf ein Kabel, ich aktualisiere sie.C++ Member Variable Change Listeners (100+ Klassen)
Was ich habe, ist jetzt:
Game::ChangePosition(Vector3 newPos) {
gameobject.ChangePosition(newPos);
SendOnWireNEWPOSITION(gameobject.id, newPos);
}
er den Code Müll macht, schwer zu pflegen, zu verstehen, zu erweitern. So denken Sie an einen Meister Beispiel:
Ich muss eine Menge Funktionen für jede Variable machen würde. Und das ist nur die Verallgemeinerung für diesen Champion, ich könnte 1-2 andere Mitgliedsvariable für jeden Champion-Typ/"Klasse" haben.
Es wäre perfekt, wenn ich OnPropertyChange von .NET oder etwas Ähnliches haben könnte. Die Architektur ich versuche funktionieren würde zu erraten schön ist, wenn ich etwas ähnliches hatte:
Für HP: wenn ich es aktualisieren, automatisch SendFloatOnWire("HP", hp);
Für Position nennen: wenn ich es aktualisieren, rufen automatisch SendVector3OnWire("Position", Position)
Für Name: wenn ich es aktualisieren, rufen automatisch SendSOnWire("Name", Name);
Was genau sind SendFloatOnWire
, SendVector3OnWire
, SendSOnWire
? Funktionen, die diese Typen in einem Zeichenpuffer serialisieren.
oder Methode 2 (Bevorzugtes), aber vielleicht
aktualisieren Hp, Position normal und dann jedes Netzwerk Thema tick-Scan alle Instanzen Gameobject auf dem Server für die geänderten Variablen und senden diejenigen teuer sein.
Wie würde das auf einem großen Spieleserver implementiert werden und was sind meine Optionen? Irgendein nützliches Buch für solche Fälle?
Würden sich Makros als nützlich erweisen? Ich denke, ich wurde zu etwas Quellcode von etwas ähnlichem explodiert und ich denke, dass es Makros verwendete.
Vielen Dank im Voraus.
EDIT: Ich denke, ich habe eine Lösung gefunden, aber ich weiß nicht, wie robust es tatsächlich ist. Ich werde es ausprobieren und sehen, wo ich danach stehe. https://developer.valvesoftware.com/wiki/Networking_Entities
Sind Sie sicher, dass der Server die ein nur ein dummer Renderer das Spiel, und der Client ausgeführt werden nicht wollen? Auf diese Weise müssen Sie nicht alle diese Attribute über die Leitung senden (und es hilft, Betrug zu vermeiden, da der Client nicht manipuliert werden kann, um unehrliche Werte zu melden). – Cornstalks
Genau so funktioniert es, aber ich muss dem Kunden immer noch mitteilen, was er rendern muss. – ioanb7
ChangePosition() ist nur ein Beispiel, wo der Client entscheidet, wohin er gehen möchte. Es ist nur ein Ziel, der Server kann entscheiden, ob es gültig ist oder nicht, usw. Ich gab es rein als Beispiel. – ioanb7