Hi.
Ich versuche gerade ein Pong - Spiel mit Onlinemodus zu erstellen. Das Problem ist, daß bei dem Spiel ziemlich starke Lags auftreten. Ich wüßte aber nicht an welcher Stelle man die Datenübertragung schneller machen könnte.
Im Optimalfall wäre kein Unterschied bei der Bewegung zwischen den Clienten erkennbar. Bei meinem Programm treten aber deutliche Lags auf. Hat jemand eine Idee wie man diese Lags verkleinern könnte?
Hier die Quellcodes von Client und Server.
Zum besseren Verständnis habe ich einige Kommentare eingefügt. Falls jemand die Programme testen will: Das Clientprogramm muß 2x gestartet werden, da der Server 2 Clienten erwartet.
Ich habe das Programm inzwischen so verändert, daß die Clienten die Lags kaum noch spüren. Allerdings treten die Lags trotzdem auf und das kann zu Problemen bei der Synchronisation führen wenn die Clienten nicht wissen, welches die Tatsächliche Position des jeweils anderen Schiffes ist.
Falls jemand sich selbst von den Lags überzeugen will muß er das Serverprogramm starten und das Clientprogramm auf seine eigene IP abgleichen. Die Lags lassen sich sehr gut verfolgen, wenn man das Clientprogramm 2x in zwei verschiedenen Appletviewern ausführt.
Wäre echt super wenn mir jemand helfen könnte.
P.S.: Die Steuerung hakt momentan etwas. Ich habe sie zu Verständniszwecken etwas vereinfacht.
Ich versuche gerade ein Pong - Spiel mit Onlinemodus zu erstellen. Das Problem ist, daß bei dem Spiel ziemlich starke Lags auftreten. Ich wüßte aber nicht an welcher Stelle man die Datenübertragung schneller machen könnte.
Im Optimalfall wäre kein Unterschied bei der Bewegung zwischen den Clienten erkennbar. Bei meinem Programm treten aber deutliche Lags auf. Hat jemand eine Idee wie man diese Lags verkleinern könnte?
Hier die Quellcodes von Client und Server.
Code:
import java.applet.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.awt.*;
import java.awt.event.*;
public class Pong extends Applet implements Runnable, KeyListener
{
static final long serialVersionUID = 0;
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
int x[] = new int[3];//X-Koordinate fuer Ball, Schiff 1 und Schiff 2
int y[] = new int[3];//Y-Koordinate fuer Ball, Schiff 1 und Schiff 2
int newPos[] = new int[3];//Speichert ueber Netzwerk vermittelte Positionnsveraenderungen
int move = 0;//fuer Bewegungsrichtung des lokal gesteuertaeen Schiffes
//boolean up, down, started = false;
Thread th = new Thread (this);//Thread fuer implementirte Runnable Funktion run()
String s;
private void getConnection(int i,int j, int k, int l){
byte[] addr = new byte[4];
addr[0] = new Integer ( i ) .byteValue ( ) ;
addr[1] = new Integer ( j ) .byteValue ( ) ;
addr[2] = new Integer ( k ) .byteValue ( ) ;
addr[3] = new Integer ( l ) .byteValue ( ) ;
InetAddress IP;
try{
IP = InetAddress.getByAddress(addr);
socket = new Socket(IP, 4444);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
} catch (UnknownHostException e) {
System.out.println("Unknown host: "+e);
System.exit(1);
} catch (IOException e) {
System.out.println("No I/O: "+e);
System.exit(1);
}
}
private void bewegen(){newPos[2]=Integer.parseInt(s.substring(1,4))-100;}
//private void vektor(){}
//private void neu(){}
public void init(){
getConnection(217,230,244,50);//Verbindung mit Server aufbauen (meine IP)
setBackground(Color.blue);//Hintergrundfarbe :O
x[0]=445;y[0]=195;//Startpositionen
x[1]=0;y[1]=165;
x[2]=885;y[2]=165;
try{
s = in.readLine();//Wartet auf Startsignal (sobald sich zwei Spieler eingeloggt haben gehts los)
}
catch (Exception e)
{
System.out.println(e);
}
addKeyListener(this);
Runnable Empfang = new Runnable()
{
public void run()
{
while(true){//Endlosschleife
try{
s = in.readLine();//wartet auf Daten...
}
catch (Exception e)
{
System.out.println(e);
}
if(s.substring(0,1).equals("b"))bewegen();
//if(s.substring(0,1).equals("v"))vektor();
//if(s.substring(0,1).equals("n"))neu();
}
}
};
new Thread( Empfang ).start();//Empfangsthread starten
th.start();//Zeichenthread starten
}
public void start(){}
public void run(){
while(true){
if((move==1)&&(y[1]<310))y[1]+=10;//Schiff nach oben bewegen
if((move==2)&&(y[1]>19))y[1]-=10;//Schiff nach unten bewegen
if (newPos[1]!=y[1]){out.println(y[1]+100);out.flush();}//falls sich die Position seit letztem Durchlauf veraendert hat
newPos[1] = y[1];
try
{
repaint(0,y[1]-10,15,91);
Thread.sleep (12);
if(y[2]<newPos[2])y[2]+=10;
if(y[2]>newPos[2])y[2]-=10;
repaint(885,y[2]-10,15,91);
Thread.sleep (12);
}
catch (InterruptedException e)
{
System.out.println(e);
}
}
}
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==40){move=1;}//Schiff nach oben bewegen
if(e.getKeyCode()==38){move=2;}//Schiff nach unten bewegen
}
public void keyReleased(KeyEvent e)
{
move=0;//Schiff bewegt sich nicht
}
public void keyTyped(KeyEvent e){}
public void paint (Graphics g){
g.fillOval(x[0],y[0],10,10);//Ball
g.fillRect(x[1],y[1], 15, 71);//Schiff 1
g.fillRect(x[2],y[2], 15, 71);//Schiff 2
g.fillRect(0,0, 900, 15);//oberer Begrenzungsbalken
g.fillRect(0,385, 900, 15);//unterer Begrenzungsbalken
}
}
Code:
import java.io.*;
import java.net.*;
class SocketServer{
static final long serialVersionUID = 0;
ServerSocket server = null;
Socket client[] = new Socket[2];//2 Sockets fuer 2 Clienten
BufferedReader in[] = new BufferedReader[2];//Eingabestroeme
PrintWriter out[] = new PrintWriter[2];//Ausgabestroeme
Runnable Thread_Client1 = new Runnable()
{
public void run()
{
String s = null;
while(true){
try{
//Daten in Empfang nehmen
s = in[1].readLine();
//Daten weiterleiten
out[0].println("b"+s);
//Puffer leeren
out[0].flush();
}
catch (Exception e){
System.out.println(e);
System.exit(0);
}
}}};
Runnable Thread_Client2 = new Runnable()
{
public void run()
{
String s = null;
while(true){
try{
//Daten in Empfang nehmen
s = in[0].readLine();
//Daten weiterleiten
out[1].println("b"+s);
//Puffer leeren
out[1].flush();
}
catch (Exception e){
System.out.println(e);
System.exit(0);
}
}}};
public void listenSocket(){
//Verbundung mit Clients aufnehmen
int i = 0;
try{
server = new ServerSocket(4444);
} catch (IOException e) {
System.out.println("Could not listen on port 4444");
System.exit(-1);
}
while(i<2){
try{
client[i] = server.accept();
} catch (IOException e) {
System.out.println("Accept failed: 4444");
System.exit(-1);
}
try{
in[i] = new BufferedReader(new InputStreamReader(client[i].getInputStream()));
out[i] = new PrintWriter(client[i].getOutputStream(), true);
} catch (IOException e) {
System.out.println("Accept failed: 4444");
System.exit(-1);
}
i++;
}
//Clients signalisieren, dass das Spiel startet
out[1].println("");out[0].println("");
new Thread(Thread_Client1).start();
new Thread(Thread_Client2).start();
}
protected void finalize(){
//aufraeumen
try{
in[0].close();
out[0].close();
in[1].close();
out[1].close();
server.close();
} catch (IOException e) {
System.out.println("Could not close.");
System.exit(-1);
}
}
public static void main(String[] args){
SocketServer frame = new SocketServer();
frame.listenSocket();
}
}
Ich habe das Programm inzwischen so verändert, daß die Clienten die Lags kaum noch spüren. Allerdings treten die Lags trotzdem auf und das kann zu Problemen bei der Synchronisation führen wenn die Clienten nicht wissen, welches die Tatsächliche Position des jeweils anderen Schiffes ist.
Falls jemand sich selbst von den Lags überzeugen will muß er das Serverprogramm starten und das Clientprogramm auf seine eigene IP abgleichen. Die Lags lassen sich sehr gut verfolgen, wenn man das Clientprogramm 2x in zwei verschiedenen Appletviewern ausführt.
Wäre echt super wenn mir jemand helfen könnte.
P.S.: Die Steuerung hakt momentan etwas. Ich habe sie zu Verständniszwecken etwas vereinfacht.