Du bist nicht angemeldet.

Werbeanzeige

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 377

Beruf: Student

  • Private Nachricht senden

1

27.02.2015, 17:39

Netzwerk Lösungen für spezielle Idee

Hi Leute,

nachdem ich jetzt längere Zeit "berufsbedingt" mit der UE arbeiten durfte, verbringe ich im Moment meine letzten Funken Freizeit mit Game-Design Überlegungen und "spiele" wieder mehr mit Unity rum. Dabei entstehen manchmal sogar sehr kleine Prototypen von für mich interessanten Konzepten die ich mir so ausgedacht habe bzw über die ich immer wieder mal nachdenke. Eines dieser, nur im Kopf und teils auf Papier existierenden, (Mobile)Spiele ist eine Art "Multiplayer Tower Defense" (wie Clash of Clans und andere Vertreter dieser Gattung).

Diese Idee ist jedoch das erste Konzept, welches massiv auf (non real-time) Multiplayer setzen würde, ein Gebiet in dem ich mich nicht wirklich auskenne (wenn nur theoretischer Natur).
Ohne jetzt zu genau über diese Idee sprechen zu wollen/können versuche ich mal ein wenig auf meine Topic-Frage zu kommen. Nehmen wir einfach mal als Substitutionsspiel Clash of Clans, einfach weil es vermutlich jeder kennt und viele in diesem Forum sogar mal gespielt haben könnten.

Also einfach mal als Gedankenspiel: Wir wollen Clash of Clans implementieren, eben mit Unity.
Wir brauchen eine Datenbank irgendwo im www, welche alle Nutzerdaten speichert, das wären z.B.
  • Unique Spieler-ID
  • Spielername
  • Ressourcen
  • Gebäudeplan
  • Gebäude-Zeitplan (Gebäude X wird noch Y Sekunden geupdated)
  • Standort
  • Plattform
  • ...
Bei Spielstart würde sich der Spieler dann bei einem Server melden und alle Daten abfragen, verschlüsselt, sicher, schnell.
Bei jedem Upgrade/Bau/whatever wird Meldung an den Server gegeben, Server entscheidet nun ob diese Aktion legal ist.
Wenn der Spieler nun eine feindliche Basis attackieren möchte, so schön dynamisch wie in CoC, so erhält er wiederum alle nötigen Informationen des gegnerischen Spielers vom Server (Gebäudeplan, Truppen, erbeutbare Ressourcen, ...)
Jetzt wäre ich unschlüssig wie ich vorgehen würde, entweder

  • Kampf findet auf Client statt und das Ergebnis wird an den Server gesendet (und verifiziert: if(erbeuteteRessis > erbeutbareRessis) return :pillepalle: )... oder
  • Kampf findet komplett auf Server statt und lediglich der Spieler-Input wird an den Server gesendet. Client erhält Ergebnis.
  • Client-side prediction: Beides geschieht parallel und es gibt einen Abgleich
  • ?
Hier ist sicherlich zu beachten, dass wir das Spiel eventuell im Bus spielen, auf dem Nachhauseweg von der Dorfschule durch den dunklen Wald, Akku ist fast leer und die Verbindung ist instabil.
Man kann dieses Spiel noch ellenlang weiter führen, aber ich denke als Einleitung in meine Frage / in die Diskussion genügt das erstmal. Es soll wohl eher eine Diskussion sein, sicherlich kein "Sc4v du musst nur Network.DoAwesomeStuff(); callen 8| "

Also angenommen wir wollen Clash of Clans implementieren, eben mit Unity. :hmm:
Welche Server, woher kommen diese, wie werden diese skaliert (10 versus 1Mio Concurrent Users). Wie speichert man die DB? Zentral, verteilt, whatever.
Gibt es hier schon Lösungen, auch speziell für Unity? (PUN, uLink, Amazon Cloud, whatever)
Würde vielleicht schon eine dynamisch skalierbare DB irgendwo im WWW (wo gibt es sowas? ^^) gehostet schon genügen, welche durch Server Code in einer Cloud angesprochen wird? Geht es besser?

Bereits gesagt, aber lieber nochmal wiederholt. Das hier soll kein Thread werden in dem ich euch ein AAAA mobile Game ankündigen will, welches ich im Moment implementiere, inklusive maßloser Selbstüberschätzung. Nein, ich spiele nur mit meinen Gedanken und will ein wenig darüber diskutieren, vielleicht ein paar nützliche Informationen erhalten und bestehende Wissenslücken stopfen (siehe skalierbare DB irgendwo im WWW).
Zu meinen Fähigkeiten: Ich könnte die Idee umsetzen, auf einem lokalem Server mit 3 Freunden laufbar machen und alles beschriebene auch implementieren... würde dann aber erschreckt feststellen, dass mein System nicht auf > 3 Spieler skaliert, geschweige denn auf 1 Mio CCU...

Schonmal Danke fürs Lesen und Wirken lassen. Ich bin dann mal weiter :hmm:
Sc4v

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sc4v« (27.02.2015, 19:34)


Nox

Supermoderator

Beiträge: 5 284

Beruf: Student

  • Private Nachricht senden

2

27.02.2015, 19:59

Ich glaube das Thema "Spielrelevante Logik auf Clientseite berechnen lassen" haben wir bereits oft genug behandelt. Da "everybody lies" gilt, muss schon der Server ran. Als DB ein System wie PostgreSQL oder MySQL zu nutzen ist sicher auch keine schlechte Idee. Die sind eig ganz gut skalierbar und bis denen der Dampf ausgeht, muss man echt schon was anstellen (wahlweise echt dämliche Abfragen formulieren). Davor einen Dienst als Proxy schalten, der bei Bedarf auf mehrere Dämonen aufgeteilt werden kann, und tada-schon hat man ein grundsolides System.
Wahlweise könntest du auch mal in den Code der diversen MMO Piratenserver schauen (z.B. WoW), um dich inspirieren zu lassen.

P.S: ob du an einem Server durch Nutzung von Cloud Servicen vorbeikommst, kann ich nicht sagen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 377

Beruf: Student

  • Private Nachricht senden

3

28.02.2015, 12:58

Schonmal Danke für das Feedback!
Habe zB das hier gefunden, das würde dann wohl vermutlich funktionieren?

4

01.03.2015, 03:36

Mich hat das Thema angesprochen und ich habe mal ein bisschen "recherchiert":

http://aws.amazon.com/solutions/case-studies/supercell/
Amazon Webservices scheint die Grundlage ihrer Infrastruktur zu bilden. Es gibt einen Haufen Spieleserver, die über die AWS API orchestriert werden.

http://www.pocketgamer.biz/feature/45814…clash-of-clans/
Der Client ist in C++/Objective C und der Serverkram ist in Java geschrieben.

Wenn man danach sucht, findet man viele Quellen, die zeigen wie man in CoC offline Bauen, Attacken durchführen usw. kann, das ganze wird beim Reconnect natürlich zurückgesetzt. D.h. das ganze Spiel scheint mehr oder weniger ohne Server zu funktionieren. Die Aktionen werden durch die Server nur verifiziert. Das würde ich für solche Spiele auch empfehlen, da das viel ressourcensparender ist.

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 377

Beruf: Student

  • Private Nachricht senden

5

01.03.2015, 12:16

Danke für das Teilen dieses Wissens, sehr interessant zu lesen :thumbsup:

Edit: Es gibt auch ein AWS Unity Plugin

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sc4v« (01.03.2015, 12:51)


Nox

Supermoderator

Beiträge: 5 284

Beruf: Student

  • Private Nachricht senden

6

01.03.2015, 12:50

Hmm gibt es in CoC viele Probleme mit Hackern? Weil wenn die Logik wirklich Clientseitig laufen würde...
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 377

Beruf: Student

  • Private Nachricht senden

7

01.03.2015, 12:56

Das weiß ich nicht, ich kann mir aber vorstellen, dass zumindest die Kämpfe, da komplett deterministisch, sowohl Client als auch Serverseitig berechnet werden und es dann am Ende nur einen Abgleich gibt.
Bei allen anderen Spielelementen ist CoC meiner Erachtens nicht hackbar... bzw wenn nur lokal hackbar und bei einem reconnect geht der gehackte Fortschritt einfach verloren.

Nox

Supermoderator

Beiträge: 5 284

Beruf: Student

  • Private Nachricht senden

8

01.03.2015, 13:03

Man kann ja die Daten nach dem reconnect im Speicher modifieren (Stichwort Trainer) oder gleich das Protokoll reverse engineern.

P.S: ahh pardon. Das beobachtete Verhalten kann natürlich auch einfach client side prediction sein.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (01.03.2015, 13:58) aus folgendem Grund: kleiner, aber unschöner Rechtschreibfehler


9

01.03.2015, 15:09

Mit den Google Diensten kannst Du sicher ähnlich gut arbeiten wie mit AWS. Es gibt in der Richtung ja schon einige Anbieter...

Ich stelle mir das bei CoC wie eine Art transaktionsbasiertes System vor. Beim Spielen wird ein Transaktionslog geschrieben. Das wird dann serverseitig einfach regelmäßig nachvollzogen - insbesondere vor Transaktionen mit anderen Spielern. Auf diese Weise spart man sich viel Traffic und die Spieler können auch mal zeitweise offline spielen.

Man kann ja die Daten nach dem reconnect im Speicher modifieren (Stichwort Trainer) oder gleich das Protokoll reverse engineern.
Hier scheint insbesondere die Programmierung in C++ den Hackern Probleme zu bescheren. Aber wie gesagt, es wird ja im Sinne von "client side prediction" eh noch mal alles nachgeprüft. Da die Client-Server-Nachrichten und fast alles andere im Spiel verschlüsselt werden, kann ich mir aber gut vorstellen, dass da einige Sicherheitslücken bestehen. Es gibt wohl schon einen "Privat-Server" für CoC. Da gibt es auch ein paar Entwicklervideos zu, in denen man erkennt, wie die Nachrichten aufgebaut sind (Nachrichtentyp als Zahl und dann der Body, wie auch sonst...). Ich nehme an, der Privatserver übernimmt nur die "langfristige" Speicherung, ein paar Informationsausgaben und Kommunikation zwischen den Spielern, d.h. dort wird bestimmt keine Verifizierung gemacht, das Spiel läuft einfach mehr oder weniger offline...

Werbeanzeige