Que de soucis!

Quel expérience étonnante ce jeu. Il est vrai que la librairie Panda assiste tellement sur des points techniques qui m'ont fait hérissés les cheveux sur la tête dans d'autres contextes, qu'on arrive vite à des réels problèmes de conception, et non pas à des soucis de second ordre.

Mon gros problème à ce jour est vraiment le calibrage du réseau. Il est évident que les joueurs et le serveur doivent partager un ensemble de données (position des uns des autres, déplacement, actions, ...).

Le problème concerne les données en temps réel. Je me rends bien compte qu'il n'est pas possible de donner à chacun en temps réel toutes les informations concernant les uns les autres. Le flux de données devient énorme, et continu.

En une seconde, chaque joueur va recevoir entre 10 et 20 positions pour un vaisseau. Imaginons que vous avez 10 vaisseaux dans la zone, vous êtes alors en train de traiter 100 informations secondes.

Le problème n'est pas tant la quantité, bien que cette quantité soit non négligeable, car le jeu en lui même n'est pas juste une machine à traiter des flux réseaux, mais à résoudre énormément de choses de manière synchrones (gestion des collisions, souris, ...).

Le problème est aussi la synchronisation de ces informations. Le serveur peut très bien être capable d'envoyer un flux de 20 messages secondes pour une même entité, alors que le client lui n'est capable de traiter que 5 de ces messages secondes.

Nous nous retrouvons donc dans une situation, où les messages vont s'accumuler et seront traités avec un retard cumulé de plus en plus important. La conséquence est que les vaisseaux seront affichés en décalage temporel d'autant. Une simple rotation peut être affichée avec 5 sec de retard. Imaginons alors les manoeuvres d'évitement, où les engagements sur des positions périmées.

Une solution pourrait être de donner un temps de péremption au message, et de ne traiter que les messages non périmés. L'expérience pourrait être menée, mais le problème reste qu'il faut quand même parser chaque message pour sortir cette date de péremption, et qu'il faut quand même itérer sur chacun des messages.

Une solution préconisée, et connue est l'extrapolation. Au lieu d'envoyer un flux de données continu, le server envoie par fréquence plus espacée, cette même information, afin de ne pas noyer le client sous l'information qu'il n'est pas capable de traiter de toute façon.

Par contre, le server fournit plus d'informations, que simplement la position et la direction. La vitesse par exemple, ou la cible.

Ainsi le client, pourra calculer les prochains mouvements comme le fait le server. Ces calculs sont plus rapides que le traitement d'un message réseau. Pour être sûr d'être en phase avec le server, le server envoie la position réelle et les quelques informations de comportement, au client toutes les secondes par exemple.

C'est une sorte de synchronisation, et d'arbitrage.

Le flux réseau est très largement réduit, et on obtient quelque chose de plus fluide, même si ce n'est pas l'exact réalité. C'est pour cela que dans certains jeux en ligne (MMO par ex), on a parfois des "lags" ou des personnages qui subitement changent d'emplacement. Le calcul de la trajectoire, et l'emplacement réel étaient désynchronisés.

Dans la conception, il faut ensuite être clair sur qui possède la référence, et à qui est dévolu certains calculs?

Ce petit "lag" peut être perçu comme injuste par les joueurs mais sont la conséquences des limites d'un traitement déjà lourd.

Je pense qu'il faut sacrifier le "réalisme", et une modélisation informatique "parfaite" pour une fluidité beaucoup plus agréable pour le joueur.

Je me rends compte qu'il est utopique de mettre côté serveur l'ensemble des calculs et de faire profiter des résultats aux joueurs.

Chaque client devra effectuer ses propres calculs de déplacement, collision en doublon avec les autres, et le server, afin de limiter le flux réseau.

L'aventure continue néanmoins.

Je suis désolé pour l'instant tout cela est très informatique. J'espère dans la semaine qui arrive mettre un terme à ce gros problème, et pouvoir passer à des éléments de game design, et pouvoir parler de problèmes plus parlant.

lignes de code :

Client : 2446

server : 997