Netzwerk
MavonEngine verwendet eine autoritative Server-Architektur für Multiplayer. Der Server ist die einzige Wahrheitsquelle — Clients senden Befehle, der Server verarbeitet sie und sendet den Zustand zurück an die Clients.
Referenz: Die Architektur ist inspiriert von Gaffer On Games und Source Engine Multiplayer Networking.
Transport
Echtzeit-Daten werden über UDP via WebRTC mit geckos.io übertragen. Dies ermöglicht latenzarme, unzuverlässige Nachrichten, die für die Spielzustandssynchronisierung geeignet sind.
Architekturübersicht
Client Server
│ │
│── Befehl (Eingabe) ─────────► │
│ │ 1) Befehl verarbeiten
│ │ 2) Physik-Schritt
│ │ 3) Zustand aktualisieren
│◄── Zustandsabgleich (Tick) ── │
│ │
- Client erfasst Eingaben und sendet Befehle an den Server
- Server stellt Befehle in einen Befehlspuffer
- Bei jedem Tick verarbeitet der Server Befehle, berechnet Physik und sendet den Weltzustand
- Zustand wird nur an Clients innerhalb des Sichtbarkeitsradius jeder Entity gesendet
Gemeinsame 3D-Szene
Sowohl Server als auch Client betreiben eine Three.js-Szene, jedoch mit unterschiedlichem Zweck. Der Client hält die vollständige Szene - detaillierte Meshes, Materialien und visuelle Geometrie. Der Server hält vereinfachte Hitbox-Meshes - leichtgewichtige Geometrie, die ausschließlich für räumliche Abfragen genutzt wird.
Das bedeutet, der Server kann autoritativen Raycasting, Treffernachweis und Flächenwirkungsprüfungen direkt gegen seine Szene durchführen, ohne den vom Client gemeldeten Positionen zu vertrauen - und ohne den Overhead vollständiger visueller Geometrie.
// Serverseitiges Raycasting gegen Hitbox-Meshes
const raycaster = new THREE.Raycaster()
raycaster.set(origin, direction)
const hits = raycaster.intersectObjects(game.scene.children, true)