Forum



OLiver am 14.01.2006 14:38 #385

FloSofts Coding-Sklave
Um ein einheitliches Interface für Einzel- und Mehrspieler hinzubekommen, haben wir beschlossen, dass auch Einzelspieler ausschließlich auf Netzwerkbasis läuft, indem man dann einfach zum localhost verbindet.
Das heißt nun allerdings, dass ich erstmal das Grundgerüst für das Netzwerk erstellen muss, bevor das Spiel weitergemacht wird. In Zukunft ist das aber von großem Vorteil, da so die Entwicklung vom Netzwerk und Spiel quasi parallel ablaufen und man am Ende nicht das gesamte Konzept auf Netzwerk umtrimmen muss.

---
Warum heißt der Staatsbürger "Staatsbürger"?
-> Weil er für den Staat bürgt.


Nocte am 22.01.2006 13:41 #426


Da habt ihr nur ein große Problem, wenn der Server down geht. Wäre es nicht besser alle die Welt berechnen zu lassen und dann die Daten nur mit den Server abzugleichen? So mache ich es zumindest in meinem Spiel.


OLiver am 22.01.2006 13:48 #428

FloSofts Coding-Sklave
Habe ich gesagt, dass der Server alles macht?  :?  Der Server soll nur eine Art Vermittler werden, der die Messages von den Spielern weiterleitet an alle Spieler und sie vorher ggf noch prüft, ob das auch überhaupt möglich ist, um Cheaten zu vermeiden.
Das eigentliche Spiel befindet sich nur auf den Clients.

---
Warum heißt der Staatsbürger "Staatsbürger"?
-> Weil er für den Staat bürgt.


Nocte am 22.01.2006 13:56 #429


Endschuldige dann habe ich es wohl falsch verstanden, es klang für mich so als ab die ganzen Berechnungen usw. der Server macht und die Clients das ganze nur noch darstellen bzw.die Eingaben zurückleitet.


OLiver am 22.01.2006 13:58 #430

FloSofts Coding-Sklave
Nein, eigentlich wollte ichs wie gesagt genau umgekehrt machen.  ;)  Also übertragen werden dann nur die Befehle, die die Clients ausführen ( z.B. baue Haus A an Pos x,y ), aber ansonsten wird alles auf den Clients berechnet ( z.b. Pathfinding etc. )

---
Warum heißt der Staatsbürger "Staatsbürger"?
-> Weil er für den Staat bürgt.


FloSoft am 22.01.2006 14:09 #432

Großmeister
nur sollte man alle paar minuten das komplette game mit allen synchronisieren, die datenstrukturen sollten ja nicht so groß sein, d.h man kann dann schon mal 30kb übertragen. evtl immer layerweise. dann sollte es auf jedenfall synchron sein, und cheaten wird auch nich so einfach

---
mfg
Flo



OLiver am 22.01.2006 14:18 #433

FloSofts Coding-Sklave
Zitat von FloSoft:
nur sollte man alle paar minuten das komplette game mit allen synchronisieren, die datenstrukturen sollten ja nicht so groß sein, d.h man kann dann schon mal 30kb übertragen. evtl immer layerweise. dann sollte es auf jedenfall synchron sein, und cheaten wird auch nich so einfach


Wenn du alle Einheiten und alle Layer der Maps überträgst, kommt schon ganz schön was zusammen. Außerdem, was soll das dann alle paar Minuten bringen. Wenn es schon asynchron ist, kannste doch eh nichts mehr machen? Das würde doch das ganze nur noch "ansynchroner" machen, weil dann die wichtigen Befehlsmessages nich mehr so schnell durchkommen.

Ich würde evtl alle paar Minuten ne Checksumme berechnen lassen und entsprechende Clients dann raushauen, die nicht synchron sind. Weiß halt dann bloß nicht, ob das zu pingelig wäre, denn ein bisschen Asynchronität tritt ja immer auf..

Wenn wir nur kleine Messages haben, dürfte das Spiel doch eigentlich auch gar nich ansynchron werden?

---
Warum heißt der Staatsbürger "Staatsbürger"?
-> Weil er für den Staat bürgt.


Nocte am 22.01.2006 14:36 #435


Es wäre doch auch möglich es so zu machen, dass immer nur die Veränderungen übertragen werden und ab und zu ein Sync Frame eingeschoben wird, wo alles rüber geht. So wird es glaube ich auch bei Egoshootern und Echtzeit Programmen allgemein gemacht, denn alle paar Min halt ich für ein bisschen zu leger :meinung:


FloSoft am 22.01.2006 17:16 #436

Großmeister
jo sowas wie nen "sync-frame" meinte ich ja halt alle paar minuten. Wenn man die Datenstrukturen durch nen bzip jagt, sollte das die ziemlich komprimieren.

---
mfg
Flo



Nocte am 22.01.2006 17:48 #439


Wie lange braucht so ein Zipvorgang und welche Lib würdest du dafür nutzen? Wollte das nämlich mal einbauen.


OLiver am 22.01.2006 17:50 #440

FloSofts Coding-Sklave
Evtl. zlib?

---
Warum heißt der Staatsbürger "Staatsbürger"?
-> Weil er für den Staat bürgt.


Nocte am 22.01.2006 17:50 #441


P.S: und das mit den Änderungen auch gelesen? Wie wollt ihr das handhaben?(bin immo auf Ideensuche :D )


FloSoft am 22.01.2006 17:52 #442

Großmeister
mach halt nen lz77, kann man leicht selbst implementieren. (also gzip)

---
mfg
Flo



Nocte am 22.01.2006 18:16 #443


zlib scheint auf jedenfall eine Option. Ich werde es morgen mal auf den Geschwindigkeit/Kompression testen.


Prophet am 23.01.2006 08:16 #444


geschwindigkeit weiß ich nicht. in 7-zip ist es reecht schnell aber ich weiß ja nicht wo der masssstab liegt...

leistungsfähig ist der algorhytmus von gzip noch leistungsfähiger wäre höchstens bz2 oder 7z


FloSoft am 23.01.2006 18:14 #446

Großmeister
bzip ist lz77 mit huffman hinterher und noch einige weitere spielereien. zlib sollte theoretisch reichen

---
mfg
Flo



Devil am 23.01.2006 18:22 #447

Deviloper
hmm bei steam verwenden die zum groß teil bz2 mein ich... müsste man mal nachgucken :) geht recht gut... also slebst bei ganzen maps :)


.bws. am 18.04.2006 04:26 #718


ich würd die zlib nehmen und fertig.
die ist gut und einfach bewährt ;)
bz2 ist zwar ein bischen besser aber braucht meines (halb)wissens nach auch mehr cpuleistung...

aber mal eine frage zu eurer sync problematik.
ich kenn mich in der richtung nicht wirklich aus aber wie wollt ihr das mit cheksummen lösen?
es gibt ja wirklich situationen (ja auch in dem spiel, nicht nur in ego shootern ;) ) in denen bruchteile von sekunden entscheiden (welcher soldat läuft zuerst in ein gebäude usw...). wenn jetzt der eine rechner nur nen bruchteil einer sekunde nen hänger hatte (oder der andere durch cheaten seinen soldaten nen meter weiter nach vorne auffen weg gesetzt hat, kann man ja sicher irgendwie einprogrammieren, auf tastendruck springen alle männchen nen meter nach vorne) dann is aus so ner kleinen asynchronen stelle gleich was viel grösseres geworden... (entweder brennen beim einen oder beim andern die gebäude...)

wäre es da nicht besser zwar die berechnung auf den clients abspielen zu lassen, aber zusätzlich noch eine referenzberechnung auffem server? und das ist dann diejenige die im zweifel zählt?
das würde zudem noch ein problem lösen nämlich ki spieler.
wenn ihr jetzt alle berechnungen immer auf dem client ablaufen lässt dann braucht man schon ne etwas dickere maschine wenn man gegen sagen wir mal 7 kiler zockt, oder?
wenn jetzt allerdings eine referenzinstanz auffem server berechnet würde könnte die ki darüber laufen...

auch hört sich das mit dem "wenn der server fliegt übernimmt ein client die aufgabe" zwar ziemlich nett an, aber das würd ich erstmal beiseite lassen da das doch nen rattenschwanz an arbeit mit sich zieht...
welcher client liesse sich ja leicht noch überprüfen aber was macht ihr wenn der hinter nem router hockt? nach nem timeout von zwei minuten den nächsten nehmen? und vorallem: was machen die ki spieler? werden die automatisch von dem anderen client dann simuliert?

prinzipiell ist sowas durch die durchgehende client/server technick (die ich übrigends _sehr_ begrüsse. hätten die pfeiffen von sunflowers das bei anno 1503 gleich durchgezogen wär das spiel um einiges besser) kein problem, aber doch eher sekundär?
das schönste wär echt mal "einfach nur" eine spielbare variante zu haben :)
die bei silenzium halten ja leider nen tiefschlaf der sich wohl über mehrere jahre hinwegzieht...

insofern nur weiter so :)
ich kann leider kein c++ und es wird wohl noch ein bischen dauern bis ichs beherrschen werd (java is in der hinsicht halt schon freundlicher ;) ) aber werd regelmässig hierherschauen.
in diesem sinne
bis denne


OLiver am 18.04.2006 10:50 #719

FloSofts Coding-Sklave
Zitat:

aber mal eine frage zu eurer sync problematik.
ich kenn mich in der richtung nicht wirklich aus aber wie wollt ihr das mit cheksummen lösen?
es gibt ja wirklich situationen (ja auch in dem spiel, nicht nur in ego shootern ) in denen bruchteile von sekunden entscheiden (welcher soldat läuft zuerst in ein gebäude usw...). wenn jetzt der eine rechner nur nen bruchteil einer sekunde nen hänger hatte (oder der andere durch cheaten seinen soldaten nen meter weiter nach vorne auffen weg gesetzt hat, kann man ja sicher irgendwie einprogrammieren, auf tastendruck springen alle männchen nen meter nach vorne) dann is aus so ner kleinen asynchronen stelle gleich was viel grösseres geworden... (entweder brennen beim einen oder beim andern die gebäude...)


Ego-Shooter oder allgemein Actionspiele haben in der Regel ein anderes Netzwerksystem als Strategiespiele. Bei letzterem wird das Spiel in Netzwerkframes aufgeteilt ( die so 200ms - 400ms lang sind) Alles ist auf diese Frames gealignt. Das heißt, ein Träger läuft z.B. 2 nwf ein Wegstück, ein Holzfäller braucht exakt 10 nwf, um einen Baum zu fällen. Das heißt die spielentscheidenden Ereignisse laufen immer auf diesen Frames ab, nicht dazwischen. Und damit ein Träger z.B. nicht von Wegstück zu Wegstück hüpft, wird einfach die Position interpoliert, je nachdem wann der nächste Frame halt anfängt, aber im Prinzip kann er auch hüpfen, das würde für das Spiel keinen Unterschied machen, nur für die grafische Ausgabe, damits einfach schöner aussieht. Bei dem Holzfäller werden halt einfach die einzelnen Animationsschritte angezeigt.

Wenn ein Spiel jetzt einen Befehl gibt, z.b. "Baue Fahne an x,y", geschieht dieser auch auf genau einem Frame, aber 1-2 Frames in die "Zukunft" verlegt. Das Kommando wird zum wServer gesendet, und der sendet es dann zu allen Clients. Und das muss genau in der Zeitspanne passieren. Dann wird das Kommando auf allen Clients zum selben nwf ausgeführt. Das muss nicht umbedingt zur selben Zeit sein, es ist irrelevant ob 100ms später oder früher, hauptsache derselbe Frame und damit ist es sozusagen gleichzeitig und bleibt synchron. Auch wenn der Spieler jetzt nichts macht, wird trotzdem ein Befehl gesendet, dass er halt nichts tut. Jeder Spieler empfängt nun (indirekt über den Server) alle Befehle von jedem Client und falls er einen nicht hat, wird das Spiel angehalten, bis es kommt, das wären dann die berühmtberüchtigten Lags.  ;) Damit ist Asynchronität quasi unmöglich, außerdem jemand cheatet, aber das merkt ja das Spiel früher oder später und da wird er einfach rausgeschmissen. So machen es AFAIK die meisten Strategiespiele und wir machens auch so. Diese Methode hat natürlich einen kleinen Nachteil, da es immer eine Verzögerung beim Ausführen von Befehlen geben wird, weil halt auf den nächsten Frame gewartet werden muss (z.B. wenn man eine Flagge baut, erscheint die erst 400-800 ms später, wenn die nwf 400 ms lang sind) Ist natürlich nicht so toll, aber damit kann man denk ich mal leben und evtl können wir das noch irgendwie verstecken.

Zitat:

wäre es da nicht besser zwar die berechnung auf den clients abspielen zu lassen, aber zusätzlich noch eine referenzberechnung auffem server? und das ist dann diejenige die im zweifel zählt?


Das wird ja automatisch gemacht. Der Server spielt ja auch mit und ist sozusagen auch noch ein Client und der Server kann auf den lokalen Client zugreifen.

Zitat:

wenn ihr jetzt alle berechnungen immer auf dem client ablaufen lässt dann braucht man schon ne etwas dickere maschine wenn man gegen sagen wir mal 7 kiler zockt, oder?


Das machste doch beim Original-S2 auch und das ist 10 Jahre alt.  :D  Die meiste Performance wird die Darstellung der Grafik fressen, nicht das Pathfinding. Hoffe ich zumindest, dass es auch so bleibt...

Zitat:

wenn jetzt allerdings eine referenzinstanz auffem server berechnet würde könnte die ki darüber laufen...


Ja, die KI wird auch auf dem Server laufen, wo soll sie sonst laufen? ;)

Zitat:

auch hört sich das mit dem "wenn der server fliegt übernimmt ein client die aufgabe" zwar ziemlich nett an, aber das würd ich erstmal beiseite lassen da das doch nen rattenschwanz an arbeit mit sich zieht...


Naja große Arbeit, nicht da ja jeder Client eine exakte Kopie des Spieles besitzt.

Zitat:

elcher client liesse sich ja leicht noch überprüfen aber was macht ihr wenn der hinter nem router hockt?


Wer zu blöd ist, Ports freizuschalten, ist selber schuld. :rolleyes:

Zitat:

nach nem timeout von zwei minuten den nächsten nehmen?


Zum Beispiel...

Zitat:

werden die automatisch von dem anderen client dann simuliert?


Warum nicht?

Zitat:

hätten die pfeiffen von sunflowers das bei anno 1503 gleich durchgezogen wär das spiel um einiges besser


Ja, wenn sie von Anfang an so nen System wie das obige eingebaut hätten, wäre sicher ein MP-Part kein Problem gewesen, aber wahrscheinlich hatten die noch keine Ahnung von Netzwerkprogrammierung (wer probiert schon DirectPlay aus?  :rolleyes: ) und haben es halt nur auf Offline ausgelegt und da is klar, dass es nur Asyncs gibt.

Zitat:

prinzipiell ist sowas durch die durchgehende client/server technick kein problem, aber doch eher sekundär? das schönste wär echt mal "einfach nur" eine spielbare variante zu haben


Was willst du damit sagen?  :?

---
Warum heißt der Staatsbürger "Staatsbürger"?
-> Weil er für den Staat bürgt.


FloSoft am 18.04.2006 11:53 #720

Großmeister
Zitat von OLiver:

Zitat:

prinzipiell ist sowas durch die durchgehende client/server technick kein problem, aber doch eher sekundär? das schönste wär echt mal "einfach nur" eine spielbare variante zu haben


Was willst du damit sagen?  :?


Er will damit sagen das es bis zur Revision 1337 :D nicht mehr weit hin ist :)

---
mfg
Flo



.bws. am 18.04.2006 16:27 #723


danke für die sehr ausführliche antwort, besonders diese technik mit den netzwerkframes ist sehr interessant, ich glaub da werd ich mir mal nen bischen was zu durchlesen.
in diesem sinne schön weiterschreiben ;)
danke


~Duke am 13.08.2006 14:55 #959


Zum Thema Netzwerk hätte ich in diesem Speziellen Fall noch einen Vorschlag:
Da die meisten Aktionen eines Spielers ja ausschließlich in seinem eigenen Land stattfinden
und andere Spieler in keinster Weise beeinflussen, müsste hier nicht gewartet werden, bis
der Befehl vom Server wieder zurück gesendet wurde.
Hierbei könnten andere Clients die Aktionen der anderen Spieler sogar absichtlich um
bspw. 500ms verzögert darstellen, um kleinere Lags garnicht erst auftreten zu lassen.
Lediglich bei Ereignissen, die auch andere Spieler beeinflussen, muss auf den Server
gewartet werden (Militärgebäude besetzt, Angriff, Katapult schießt etc..), um
Asyncronität zu vermeiden.


OLiver am 21.08.2006 12:21 #968

FloSofts Coding-Sklave
Zitat:

Da die meisten Aktionen eines Spielers ja ausschließlich in seinem eigenen Land stattfinden
und andere Spieler in keinster Weise beeinflussen, müsste hier nicht gewartet werden, bis
der Befehl vom Server wieder zurück gesendet wurde.


Es muss ja überall zur gleichen Zeit stattfinden. Es nützt ja nix, wenn bei dem einen Spieler die FAhne eher gebaut wird oder der Weg und bei den anderen später, dann wirds async.

---
Warum heißt der Staatsbürger "Staatsbürger"?
-> Weil er für den Staat bürgt.


~Duke am 26.08.2006 00:30 #977


Wenn bei einem anderen Spieler die Fahne erst später erscheint, passiert doch nix
schlimmes, in wie fern soll denn da etwas asyncron werden?
Wenn eine Baracke besetzt wird, das ist etwas anderes, es vergrößert das Land und kann
sich so auch auf andere Spieler auswirken, aber ob nun die Flagge 2 Sekunden später
erscheint sollte keinen Unterschied machen. Vorrausgesetzt ist nur, dass TCP benutzt wird,
damit auch alle Befehle eines Spielers in der richtigen Reihenfolge ankommen, außerdem
dürfen die Clients das Spiel eines anderen Spielers in keinster Weise selber berechnen.

z.B. Situation: Ein Stück Holz liegt an einer Fahne, ein Gehilfe soll es weiter transportieren.
Die anderen Clients dürfen jetzt nicht eigenständig in ihrem Spiel den Gehilfen losschicken
um das Holz abzuholen, sondern auf Befehle des Clients, der diesen Spieler kontrolliert,
warten. Das ganze müsste so ablaufen:
Der Client sendet:
"Gehilfe X läuft jetzt zur Fahne Y"
-> Alle anderen Clients stellen dies dar
Wenn der Gehilfe an der Fahne ankommt, sendet der Client:
"Gehilfe X nimmt Holz und läuft zur Fahne Z"
-> Andere Clients zeigen das wieder entsprechend
und schlussendlich sendet der Client:
"Gehilfe liegt Holz an der Fahne Z ab."

Unter der vorraussetzung eines konstanten Pings läuft diese Vorgang auf allen Clients
flüssig ab. Würde der Ping zwischen dem 1. und den 2. Befehl stark ansteigen, würde
es bei anderen Spielern so aussehen, dass der Gehilfe zur Fahne geht, dort erstmal stehen
bleibt und dann erst das Holz nimmt und los geht.
Diese "zerstückelung" von Vorgängen muss so weit gehen, dass nurnoch atomare Vorgänge
existieren, die nicht zu desync führen können.

Würde z.B. der erste Befehl lauten: "Gehe zur Fahne und hole das Holz ab", könnte
folgendes bei starken Lags passieren:
Der Geholfe rennt los zur Fahne, kurz bevor er da ist reißt der Spieler den Weg ab,
was zur Folge hat, dass das Holz liegen bleibt. Die anderen Clients bekommen den Abriss-
befehl erst ein bisschen später, nachdem der Gehilfe das Holz schon aufgenommen hat.
Zumindest im originalen Siedler 2 führte das dazu, dass das Holz verschwand, und der
Gehilfe ins nächste Lager rannte. Das ganze führt jedenfalls dazu, dass der Client des
Spielers dort noch Holz liegen hat, und die anderen nicht.
Im oben genannten Ablauf wartet der Gehilfe extra auf den "nimm Holz auf" Befehl des
Clients dieses Spielers, sodass dieser Fall nicht eintreten kann.

Gleiches Beispiel könnte man bringen, wenn der Spieler einen Weg mit einer weiteren
Fahne unterteilt, und beim Client des Spielers der die Fahne sitzt ist der Gehilfe
schon hinter der neuen Fahne, und bei den anderen Clients noch davor. Überließe man
die Entscheidung, auf welches Wegstück sich der Gehilfe nun platziert, jedem Client
für sich, würde das Spiel wieder asyncron werden, sagt der Client aber explizit, dass
dieser Gehilfe sich jetzt auf das Straßenstück X stellt, ist alles paletti. Es hätte halt
nur zur Folge, dass der Gehilfe bei den anderen Spielern, wo er schon an der Fahne vorbei
gerannt ist, plötzlich wieder umdreht und zurück rennt.

Die Zerlegung aller Vorgänge des Spiels in atomare abläufe ist zwar recht kompliziert im
Vergleich zur Verwenung der "handelsüblichen" Frames Technik, hat aber eben den großen
Vorteil, dass Aktionen eines Spielers im eigenen Land nicht laggen, egal wie
hoch der Ping ist. Ausnahme sind wie eben schon angesprochen Ereignisse, die das globale
Spielgeschehen beeinflussen. Diese muss man alle korrekt isolieren und berücksichtigen.
Dazu gehört z.B. auch Steine abbauen, Holz fällen, Bäume pflanzen etc, wobei dies ja auch
nichts ist, was der Spieler direkt macht, also sollte man Lags hier nicht spüren.
Es gilt nur abzuwägen, ob der Mehraufwand sinnvoll ist.

Ich habe mal eine recht lange englische Dokumentation über diese Technik gelesen, aber
finde sie ums Verrecken nicht wieder. :(
Bin leider auch nicht so der Überflieger in gut und präzise Erklähren, darum dieser
doch etwas ausgedehntere Text, sry ;)