Adres
Utrecht, Veenendaal

Werktijden
Maandag tot en met vrijdag: 9.00 tot 17.00 uur
Weekend: 10.00 tot 17.00 uur

Networking Game Engine

Een persoonlijk project: een herbruikbare netwerk-engine voor browsergames met meerdere spelers. Photon Realtime voor het transport, een Node.js-server die de gezaghebbende toestand vasthoudt, en een client framework waartegen je een game schrijft.

  • TypePersoonlijk project
  • Periode2020
  • RolSolo ontworpen en gebouwd
  • OpgeleverdEén engine, twee speelbare games
  • Een engine, geen eenmalige game. Het client framework en de server zijn zo gebouwd dat ze ongewijzigd in de volgende game passen.
  • Realtime toestand via sockets, met een Node.js-service die bepaalt wat waar is als twee spelers het oneens zijn.
  • Er zijn twee volledige online games op uitgebracht, en de tweede had geen enkele wijziging aan de engine nodig.

Context

Ik wilde browsergames met meerdere spelers bouwen, en elke game begint met hetzelfde probleem: twee browsers het eens laten worden over wat er op dit moment gebeurt. Dat loste ik één keer op, als engine, en bouwde daarna games tegen die engine aan.

De uitdaging

Realtime multiplayer is genadeloos. Berichten komen te laat aan, komen dubbel aan of komen niet aan, en na elk daarvan moet de game in een toestand blijven die beide spelers accepteren. Een browser geeft je bovendien geen tweede proces om het werk in te verstoppen, dus de client moest licht blijven terwijl de server de waarheid bewaakte.

Wat ik deed

  • Een objectgeoriënteerde engine in JavaScript, gebouwd op Photon Realtime voor het transport, met rooms, spelers, lobbies en de match-lifecycle één keer gemodelleerd in plaats van per game.
  • Een client framework voor browserintegratie, zodat een game alleen zijn eigen toestand en regels hoeft te beschrijven, en de engine het joinen, synchroniseren en verlaten afhandelt.
  • Een Node.js-backend over sockets, die de gezaghebbende toestand vasthoudt, conflicterende invoer oplost en het resultaat terugstuurt naar elke verbonden client.
  • MySQL erachter, voor de dingen die een sessie moeten overleven: accounts, matchgeschiedenis en scores.
  • Twee games gebouwd op de engine, zo weet ik dat de abstractie standhoudt. De tweede had geen enkele wijziging aan de engine nodig om te kunnen bestaan.

Het resultaat

  • Een netwerklaag die herbruikbaar is en geen copy paste van de vorige game.
  • Twee online multiplayer browsergames, van begin tot eind speelbaar.
  • Een werkend antwoord op het lastige deel van realtime: één autoriteit, veel clients, en een vaste uitkomst als ze het oneens zijn.

Gebruikte technologieën

  • JavaScript: De engine zelf, objectgeoriënteerd geschreven zodat een game hem uitbreidt in plaats van forkt.
  • Node.js: De server die de gezaghebbende game state en de socketverbindingen daarnaartoe beheert.
  • Photon: De Realtime networking service waarop de engine is gebouwd.
  • MySQL: Accounts, matchgeschiedenis en scores.

Als realtime state tussen veel clients het probleem is dat voor je ligt, leg het aan me voor en ik vertel je hoe ik het zou aanpakken.