2012-04-11 16 views
2

Hallo Ich wollte dir sagen, dass ich Multiplayer für mein Spiel gemacht habe und es funktioniert, aber von 1 Seite Europas zu anderen dauert es 8 Sekunden. Es gibt nicht viel zu senden, es sendet nur ein Objekt mit float x, float y und String username.Java - Socket.writeObject() ist wirklich langsam

Im Server habe ich 3 Threads: Akzeptieren, Senden, Empfangen. Und Client hat senden und empfangen.

Teil des Sende des Servers:

oos = new ObjectOutputStream(new BufferedOutputStream(list_sockets.get(i).getOutputStream())); 
int client_state = list_client_states.get(i); 
oos.writeObject(client_state); 
oos.flush(); 

oos = new ObjectOutputStream(new BufferedOutputStream(list_sockets.get(i).getOutputStream())); 
oos.writeObject(list_data); 
oos.flush(); 

Es ist für Client-ähnlich und hier ist Servers (für den Spieler auch ähnlich) erhalten:

ois = new ObjectInputStream(list_sockets.get(i).getInputStream()); 
int receive_state = (Integer)ois.readObject(); 

ois = new ObjectInputStream(list_sockets.get(i).getInputStream()); 
DataPackage dp = (DataPackage) ois.readObject(); 

list_data.set(i,dp); 
+1

Das ist eine lange Zeit. Hast du eine Netzwerkdiagnose gemacht? Was ist die Ping-Zeit vom Server zu diesem fernen Client? Möglicherweise möchten Sie ein kompakteres Kommunikationsformat wie [protobuf] (http://code.google.com/p/protobuf) oder [Kyro] (http://code.google.com/p/kryo/) verwenden. – Perception

+0

Okay, ich werde sehen, ich habe keine Pinging-Sache und jetzt werde ich sehen, Protobuf und Kyro – IvanDonat

Antwort

0

Für das Senden eines Objekts, das eine 2 von nur besteht Floats und ein String, wird keinen großen Unterschied machen, wie Sie die Serialisierung/Deserialisierung machen. Sicher wird es nicht direkt eine Verzögerung von 8 Sekunden verursachen. (Die Auswirkung des Serialisierungsformats liegt wahrscheinlich bei einigen Millisekunden oder weniger, es sei denn, Sie verwenden Netzwerkverbindungen mit einer wirklich niedrigen Bitrate.)

Ich vermute, dass das eigentliche Problem entweder ein Netzwerkproblem ist oder (möglicherweise) eine Art Synchronisierungsfehler in Code, den Sie uns nicht zeigen.

+0

Hmm, Synchronisation. Ich habe nie darüber nachgedacht, also weiß ich nicht, wie ich das machen soll. Ich habe nur eine while (true) Schleife in einem Thread (Daemon-Thread, ich glaube, es heißt), der durch alle CONNECTED-Player läuft (also nicht an Spieler sendet, die nicht verbunden sind) und ähnliches geht an den Client. – IvanDonat

+0

PS: Ich weiß nicht, wie ich meine Serialisierung gemacht habe (ich bin noch neu im Multiplayer), aber ich habe es in meiner Objektklasse implementiert, die ich sende und jetzt online gelesen habe, dass writeObject es automatisch serialisiert. Ich denke, und ich weiß nicht, ist mein Flush() an einem guten Ort. – IvanDonat

0

Besser können Sie den Zeitstempel verwenden, um zu debuggen, wo genau Code zu viel Zeit benötigt.

long time=new Date().getTime(); 

System.out.prrintln ("Zeitstempel" + (Zeit/1000));

Mit diesem können Sie debuggen entweder zeitaufwendig in Serialisierung oder Verbindung herstellen.

Verwandte Themen