Probleme de vitesse de deplacement 2d via socket

cs_nemata Messages postés 12 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 mars 2009 - 25 mars 2009 à 23:46
cs_nemata Messages postés 12 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 mars 2009 - 27 mars 2009 à 19:07
Bonsoir, j'ai fait un serveur qui récupère les placements de 2 carrés avec les coordonnées x et y grâce à un string que je split lorsque le client souhaite l'afficher.

j'ai un double buffer qui me permet l'affichage de ma methode print() toutes les 50ms, seulement lorsque je déplace les deux carrés en meme temps l'un va plus vite que sur mon autre pc, je pense que c'est due au manque de puissance de l'autre pc, mais je ne peux pas permettre que dans un jeu en réseau un personnage avance plus vite qu'un autre.
Je ne pense pas que se soit due a la vitesse d'envois du réseau car se sont des coordonné qui sont envoyé et donc ca devrait lager mais pas aller moins vite.

Comment pourrais-je régler se problème?
Merci bien cordialement.

6 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
26 mars 2009 à 07:52
Salut,

Dès qu'on touche à un réseau et l'envoie de données pour synchroniser les deux, il faut avoir un reflex : Thread ! Si ton deuxième pc reçoit des frames par le réseau toute les 10 ms par exemple, c'est cà qui le fait ramer, par contre, si tu thread la réception de ces frames, ca ramera autant, mais tu ne t'en rendra pas compte !

A moins que tu affiche des images très très grandes avec transparence et tout et tout, je ne pense pas que ce soit l'affichage qui provoque des ralentissements : java est loin d'être lent en affichage, mais encore faut-il savoir le maîtriser.
______________________________________
DarK Sidious
0
cs_nemata Messages postés 12 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 mars 2009
26 mars 2009 à 14:51
En fait toutes les 50ms j'envoie mes coordonnées et je récupère celle des autres donc c'est bien dans un Thread, et comme je l'ai expliqué ce sont des coordonné donc peut importe que sa lag ou pas à la fin il devrait être au même endroit non?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
26 mars 2009 à 15:04
Salut,

Et bien si tu bufferise les coordonnées, et que le client a du mal à traîter toutes les trames, c'est normal qu'il aille moins vite :

Tu lui envoie 20 coordonnées par secondes, mais s'il ne peut en traîter que 10 par secondes et qu'il bufferise toutes les coordonnées, alors ton personnage ira 2 fois moins vite vu qu'il lui faudra 2 secondes pour traîter la dernière coordonnée, et donc positionner ton personnage au bon endroit.

La solution : détruit les trames qui n'ont pas le temps d'être traîté (en ne traîtant que la dernière reçu).

Après faut voir comment est fait ton code : si tu traîte tout cà dans le thread d'affichage, c'est normal que ca soit aussi lent : le thread d'affichage gère... l'affichage, et ne doit être utilisé que pour cela ! Je te cite : "je récupère celle des autres donc
c'est bien dans un Thread", rien ne dit que c'est fait dans un thread à part ! Tu peux très bien le faire dans le thread courant (récupèration des trames toutes les 50 ms avec un Thread.sleep par exemple).
______________________________________
DarK Sidious
0
cs_nemata Messages postés 12 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 mars 2009
26 mars 2009 à 18:42
Je pense que j'utilise mal les Thread je vais te poster mon code,
Voila mon Thread qui est lancé des le démarage :
/***
* Début Thread
***/
public void refresh(){
tGame = new Thread(){
public void run(){
while(true){
try {
//deplace Oval si une touche est enfoncé
oval.deplacements();
//envoie les coordonnées sous forme de String
send.run(oval.getCoord()) ;
repaint();
sleep(50);
} catch ( Exception e ) {}
}
}
};
tGame.start();
}
/***
* Fin Thread
***/
Maintenant mon objet send qui est un Thread
/***
* Debut Send
***/
public class Send extends Thread{
private String ip = "192.168.1.2";
private int port = 2645;
private Socket socket;
private Main main;
private TreeMap<String, String> clientsPos;

public Send(Main main){
this.main = main;
}

public void run(String datas){
try
{
socket = new Socket(ip, port);
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();

ObjectOutputStream output = new ObjectOutputStream(out);
ObjectInputStream input = new ObjectInputStream(in);
output.writeObject(datas);
try {
//Map de "adresse du client", "coordonnée"
this.clientsPos = (TreeMap<String, String>)input.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
System.out.println("attente de connexion...");
}
}
/***
* Fin Send
***/

Je ne sais pas si le Thread est démaré quand je fais cela, mes clients bougent grâce à l'affichage de chacun dans un foreach, ma propre position passe par le réseau avant de se déplacer.

peut être la méthode utiliser n'est pas bonne, je souhaite pouvoir faire un Mmorpg par la suite mais actuellement mes clients s'affiche bien a part le problème de vitesse.

Toutes les critiques sont les bienvenue.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_nemata Messages postés 12 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 mars 2009
26 mars 2009 à 19:17
J'ai modifier mes classes, je pense que c'est un peu mieu mais le rendu est pareille voir pire car sa sature pas mal quand ils se deplacent :


/***
*DEBUT Thread
***/
public void refresh(){
tGame = new Thread(){
public void run(){
while(true){
try {
//deplace Oval si une touche est enfoncé
oval.deplacements();
repaint();
sleep(50);
} catch ( Exception e ) {}
}
}
};
tGame.start();
}

/***
*FIN Thread
***/


/***
*DEBUT SEND
***/

public void run(){
while(true){
try
{
socket = new Socket(ip, port);

OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();

ObjectOutputStream output = new ObjectOutputStream(out);
ObjectInputStream input = new ObjectInputStream(in);
datas = main.getOval().getCoord();
output.writeObject(datas);

try {
this.clientsPos = (TreeMap<String, String>)input.readObject();
sleep(50);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
System.out.println("attente de connexion...");
}
}
}

/***
*FIN SEND
***/

Mes 2 thread sont lancée dans le constructeur maintenant
0
cs_nemata Messages postés 12 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 mars 2009
27 mars 2009 à 19:07
personne peux me dire ce qu'es mon probleme?
0
Rejoignez-nous