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