# Kleines RTS Game -> Netzwerkproblem



## lohr (21. Mrz 2008)

Hallo,

Ich wusste nicht ob es hier besser aufgehoben oder im Netzwerkbereich, da es eigentlich beide Bereich betrifft.
Also wie schon erwähnt ich habe ein kleines RTS Game entwickelt (also wirklich nichts weltbewegendes), mit folgenden Funktionen:

- 3 Einheiten Typen (Worker, Soldier, Tank)
- produzierbar in 1 Hauptgebäude
- Geld bekommt man alle 10 sekunden, muss nicht gesammelt werden
- einheiten können gegen dummys kämpfen

Nun mein Problem.
Ich möchte natürlich gegen einen zweiten Spieler spielen, haltet ihr es für sinnvoll jetzt in dieses Game noch eine Netzwerkfähigkeit einzubauen oder sollte man das Spiel komplett neu aufsetzen und dabei sofort an die Netzwerkfähigkeit denken, wenn ja was haltet ihr für geschickter RMI oder Sockets oder eine ganz andere API (Simon...)?
Ich habe das Projekt von Anfang an nur zum Lernen gesehen und daher wäre es auch kein Problem neu anzufangen, jedoch hängt man halt manchmal doch ein bisschen an dem erstellen Zeug^^

Also wäre froh wenn ich ein paar Tipps von euch bekommen könnte.

Gruß Alex


----------



## doctus (21. Mrz 2008)

wenn du den code bisher ordentlich geschrieben hat, sollte es keine allzu großen probleme geben auch noch die netzwerkfähigkeit einzubauen. hängt aber wie gesagt vom code ab. mach dir einfach mal gedanken, wie du es beim aktuellen code einbauen würdest. danach sollte du dich dann bei der entscheidung richten.

sockets oder rmi:
hängt davon ab, was du alles übertragen willst. geringe datenmengen lassen sich auch mit sockets recht gut verarbeiten. bei größeren datenmengen würde ich persönlich eher zu rmi tendieren(sieh dir auch mal SIMON an; ist iwo im bereich codeschnipsel und projekte. habs zwar selbst noch nicht ausprobiert, aber gucken schadet ja nicht).

lg doctus


----------



## lohr (21. Mrz 2008)

Also ich würde sagen sehr ordentlich geschrieben ^^
Natürlich was andere davon halten ist ne andere Sache, aber habe heute auch extra nochmal nen kleines redesign reingelegt und paar zeilen code mir sparen können.

Ja also ich denke ich probier es anfangs mal über sockets.
Kann aber sein das ich da gut eure Hilfe brauche ^^ wäre meine erste "Netzwerkunterhaltung" in Sachen Java  aber wird mit Sicherheit auch interessant, hoffe ich kann da auf eure mithilfe zählen 

Setz mich jetzt über Ostern mal hin...


----------



## lohr (22. Mrz 2008)

Also ich wollte mich grad dransetzen...
Mir schwebt folgendes vor, grundsätzliches Prinzip "Client-Server":

- Server wartet auf die Connection der beiden clients
- der server hat von jedem objekt eine kopie und wenn der spieler sagen wir mal eine einheit bewegt, sendet dieser die IST und SOLL Koordinaten an den Server dieser bewegt die Einheit und sendet die daten weiter an den anderen Client

Ist so ein vorgehen sinnvoll oder gibt es bessere methoden, also das war halt das erste was mir eingefallen ist und hört sich für mich auch relativ simpel an zum umsetzen...

Man müsste den server ja sogar so umbauen können das er nichts mehr zeichnet sondern einfach nur noch koordinaten von objekten speichert oder?


----------



## doctus (22. Mrz 2008)

genau. den server kannst du komplett über konsole laufen lassen.
deine vorgehensweise ist im allgemeinen ganz gut. ich würde allerdings ein paar kleinigkeiten anders machen:
-übergib dem server nicht die koordinaten, sondern lediglich eine eine richtung, einen schussbefehl oder ähnliches, die der selber in die nächste koordinate umsetzt. das verhindert, dass ein manipulierter client beliebige koordinaten an den server schicken kann.
-schicke diese koordinaten dann an BEIDE clienten zurück. sollte der server irgendetwas an dem, was der client gesendet hat nicht gefallen, werden beiden clienten wieder die richtigen daten vermittelt.

lg doctus


----------



## tuxedo (26. Mrz 2008)

Je nachdem wie "schnell" und "häufig" diese Daten an den Server gehen würde ich zu RMI/SIMON raten, oder auch abraten.

RMI und SIMON basieren auf der serialisierung, welche nicht gerade die schnellste ist. Wenn solche Daten oder Aufrufe sagen wir mal, nur max. 5-10mal pro Sekunde geschehen, keine komplexen Objekte als Argument übergeben werden müssen oder zurückkommen, und die Datenmenge im Argument oder im Return-Wert recht gering ist, dann ist RMI/SIMON sicher eine gute Möglichkeit. 

Schneller ist es auf jeden Fall sich ein eigenes Protokoll zu überlegen (und da gehört stupides String-Verschicken mit einem Writer IMHO nicht dazu) und das dann anzuwenden.
Der Overhead ist am geringsten und du hast direkten Einfluss auf die Art der Datenaufbereitung vor und nach dem Senden und somit auch auf die Geschwindigkeit. 

Nachteil ist halt, dass du dir erst ne kleine Protokoll-Schicht basteln musst.


----------

