Bonjour à tous
Je travaille actuellement à l'élaboration d'un jeu 3D en C++.
Simplifions en disant qu'il s'agit d'une sorte de bataille navale à N joueurs
J'ai un vrai souci vis à vis des sockets winsock qui permettent de gérer les aspects réseaux (TCP, recv non bloquants)
a) En effet, le process principal (le main) est géré par GlutMainLoop()
b) Parallèlement en mode Server, un Thread de priorité THREAD_PRIORITY_BELOW_NORMAL permet de gérer l'attente des connexions TCP
c) Dès que la première connexion est enregistrée, un thread de priorité THREAD_PRIORITY_BELOW_NORMAL permet côté Serveur de faire des receive non bloquants sur tous les slots réseau libres
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 while(1) { if(accept(premier_slot_disponible)) ... }
d) Côté client, deux threads priorité THREAD_PRIORITY_BELOW_NORMAL gèrent
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 while(1) { for(int i = 0 ; i < nbConnectes ; i++) { recv(slot[i],buffer); if(strlen(buffer) != 0) Redispatch(i,buffer) // renvoie l'info à tous les clients } }
- l'envoi des messages
-la réception des messages
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 while(1) { switch(dataToSend) { case CHAT: send(server,...) break; case UNITY_MOVED: send(server,...) break; default:; }
L'ensemble marche bien mais les traitements réseaux sont très lents. Lorsque je teste 1 ou 2 instances de l'exe sur la même machine, en réseau local (127.0.0.1), plusieurs secondes peuvent passer entre l'envoi de la donnée depuis un client (un texte de chat par exemple) et son affichage sur les autres clients
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 while(1) { recv(socket, buffer) if(strlen(buffer)) Traitement(buffer); }
Si j'augmente la priorité des threads, c'est l'OpenGL qui devient subitement plus lent et le nombre de fps diminue.
Que faire, que changer dans le moteur réseau ?
Merci d'avance
Partager