[Réseau] Performance des sockets c++
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
Code:
1 2 3 4 5 6
|
while(1)
{
if(accept(premier_slot_disponible))
...
} |
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:
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
}
} |
d) Côté client, deux threads priorité THREAD_PRIORITY_BELOW_NORMAL gèrent
- l'envoi des messages
Code:
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:;
} |
-la réception des messages
Code:
1 2 3 4 5 6 7
|
while(1)
{
recv(socket, buffer)
if(strlen(buffer))
Traitement(buffer);
} |
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
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