# Bester Stream für ein Spiel?



## dayaftereh (12. Feb 2009)

Hey

Also ich habe vor ein Netzwerk Spiel in Java zu schreiben. Es handelt sich da um ein 2D Spiel wo man in eine Weltraum herum Fliegten kann^^. Nur ich stelle mir gerade die Frage, welchen Stream ich nehmen soll um die Daten vom Server zu den Clients zu übermitteln. Meine erste Idee war, eine BufferedReader & BufferedWriter zu nutzen da ich dann einfach zo meine Informationen verschicken kann.(Ich will keine Bilder verschicken)

Typ|Name|ObjecktName|Position|X|Y…|….|imagePath

Natürlich will ich das ganze Performant halten, deswegen habe ich mal bei anderen Netzwerk Spielen geschaut und die Nutzen ein DataInputStream^^ aber da bekomme ich die Daten als Byte Arrays, natürlich ist das kein Problem aber bei dem BufferedWriter ist ja die readLine() blockiert. Was sehr schön ist da ich einfach auf die Daten warten kann, Aber wenn ich so was jetzt bei DataInputStream machen würde, hätte ich ne liste welche ich befühle, entleere und gleichzeitig eine schleife mit aktivem Warten..

Meine frage jetzt was ist der beste Stream um in einem Spiel zu benutzen?????


----------



## byte (12. Feb 2009)

Ein Reader/Writer ist kein Stream. :roll:


----------



## dayaftereh (12. Feb 2009)

Hast ja recht aber ihr wiesst was ich Meine^^


----------



## Gelöschtes Mitglied 5909 (12. Feb 2009)

wie wärs mit nem ObjectOutput/InputStream?


----------



## tuxedo (12. Feb 2009)

Object-Streams serialisieren --> je nach Typ den es zu serialisieren gibt --> Langsam.

Würde das auf ein ziemlich einfaches Protokoll auf byte-Ebene runterbrechen und Apache MINA verwenden. Das macht die Sache unheimlich einfach, und man hat auch gleich noch NIO statt IO.


- Alex


----------



## dayaftereh (12. Feb 2009)

Coole Idea habe auch schon mal dran gedacht.... aber ich glaube ist zimlich Komplezzzz!!! deswegen wollte ich es auch mal selbst schrieben, aber ich glaube Ich schicke Strings^^ natürlich keine^^ Das heißt POSITION = 1 also alles Positions Strings haben den Typ 1 na ich glaube so bekomme ich es am einfachst hin


----------



## Ebenius (12. Feb 2009)

Sind am Ende die Satzzeichen knapp geworden. Interpunktion ist auch nicht mehr das was sie mal war. :roll:


----------



## Oni (13. Feb 2009)

Ich versteh ihn (auch ohne Satzzeichen ;-) )


----------



## tuxedo (13. Feb 2009)

@daya

Nö, ist nicht so komplex. Komplex und langsam wird's wenn du alles auf String abbildest. 

Schau dir dich mal auf der Apache MINA Projektseite (google hilft) die Sache mit der ProtocolCodecFactory an. 

Das braucht zwar je nach Anzahl der zu verschickenden Nachrichtentypen etwas Code, aber du bist unheimlich flexibel und es geht super schnell.

Zu dem DataInput und Outputstream:
Da kannst du ganze Datentypen reinstecken. Also Integer, String, Long, Byte, ... 

Bevor ich das ganze Protokoll auf Strings aufbauen würde, würde ich doch eher den Data*Stream benutzen und eine sauber definierte Reihenfolge der Datentypen die rein und rausgehen festlegen.

- Alex


----------



## homer65 (13. Feb 2009)

Ich benutze für ähnliches immer ObjectInputStream bzw ObjectOutputstream. Das vereinfacht die Programmierung erheblich.


----------



## Ebenius (13. Feb 2009)

homer65 hat gesagt.:
			
		

> Ich benutze für ähnliches immer ObjectInputStream bzw ObjectOutputstream. Das vereinfacht die Programmierung erheblich.


Ich stimme tuxedo zu. Wenn es schnell sein soll und keine riesigen Java-Objekt-Päckle übertragen werden sollen, dann ist Serialisierung der falsche Weg.

Ebenius


----------



## tuxedo (13. Feb 2009)

ObjectInputStream bzw ObjectOutputstream -> Serialisierung -> Nicht besonders performant.

Aber das wurde ja nur weiter oben schonmal erwähnt.


----------



## dayaftereh (13. Feb 2009)

Also ich Nutze jetzt Mina ich denke das ist eine sehr saubere und einfache lösung. 

Mina:

Ich habe mal ne frage zu Mina und zwar kann ich da ja Objekte verschicken. Ich habe mal zu übung eine Chat Cleint und Server geschieben wo ich Strings verschicke. Nur stelle ich mir die frage wie soll ich die infomationen für das Spiel verschicken als "String "oder den "String als Byte Array"? Oder lieber gleich nur Byte Arrays? und was macht Mina mit eine String wenn ich den verschicke?

Danke


----------



## Ebenius (13. Feb 2009)

Ich kenne Mina nicht, aber ich würde Strings als UTF-8 kodierte Byte-Folgen verschicken.

Ebenius


----------



## dayaftereh (13. Feb 2009)

Ja ich denke mal das wär das einfachste^^

Also ich mache dan sozu sagen String Packete das heißt jedes Packet Bekommt ein Typ z.B. POSITION und das scheibe ich dan als 1 um den Traffec klein zu halten^^ Damit hat jedes String Paket eine Typ asl Int wert^^


----------



## tuxedo (13. Feb 2009)

Du hast dir wohl nicht die Sache mit der ProtocolCodecFactory angesehen....?!

Da bekommt jede Nachricht einen Typ der mit einem Byte kodiert wird. Und jede Nachricht hat eine Encoder und Decoderklasse. D.h. du kannst da reinstecken was du willst:

Steckst du in Nachricht Typ 0x00 folgendes rein:

byte
Integer
String
String

Dann musst du im Decoder das in der Reihenfolfe wieder auslesen.

- Alex


----------

