J'ai écrit un jeu multijoueur Flash 2D et un serveur de socket. Mon plan initial pour l'algorithme de mouvement entre le client et le serveur était le suivant:
mon calcul actuel pour le client (même mathématique est utilisé dans le serveur) ==> p>
Tournage fort> p> var newTimeStamp:uint = UtilLib.getTimeStamp(); //set current timeStamp
var distance:uint = Math.round((newTimeStamp - movementTimeStamp) / 1000 * 300); //speed = x pixels forward every 1 second
movementTimeStamp = newTimeStamp; //update old timeStamp
var diagonalChange:Array = getDiagonalChange(movementAngle, distance); //with the current angle, howmuch is dX and dY?
x += diagonalChange[0];
y += diagonalChange[1];
private function getDiagonalChange(angle:uint, distance:uint):Array
{
var rAngle:Number = angle * Math.PI/180;
return [Math.round(Math.sin(rAngle) * distance), Math.round((Math.cos(rAngle) * distance) * -1)];
}
3 Réponses :
Votre serveur est-il si lent qu'il ne peut pas gérer tout le mouvement? Surtout dans un match de 2-D? Typiquement, lorsque je fabrique de petits jeux 2D, le serveur me donne tous mes mouvements, aucun calcul n'est requis sur le client. Si le serveur commence à décoller, je gèle simplement un peu, ce que l'on s'attendrait généralement à ce que cela soit de toute façon (bien que cela ne se produise presque jamais). P>
Dans tous les cas, je verrais certainement comment la performance est sans que le client fait des calculs réels eux-mêmes. Si la performance n'est pas suffisamment bonne, voir si la boucle via les mouvements du joueur sur le serveur provoque le délai (et commencez à utiliser un fil différent pour chaque client). P>
S'il y a en effet une restriction réelle dans la bande passante (les mouvements eux-mêmes passent très peu de données), alors vous devez certainement trouver le délai moyen de cet utilisateur particulier et calculer cela dans l'algorithme. Cependant, continuer à trouver la moyenne de la moyenne (pour la précision), vous devrez continuer à ping le serveur pour trouver le temps de déplacement, ce qui ne devrait pas être tout ce coûteux. P>
Ce n'est pas un petit jeu 2D. Il est censé gérer des centaines de joueurs simultanément. J'ai besoin de la plupart du système optimisé possible.
HMM, dans ce cas, modifier le serveur de manière à ce qu'il envoie des données de petits intervalles suffisants. Bien sûr, tous les serveurs auraient besoin d'une sorte de capuchon de joueur, mais à tout le moins ajoutent un retard de 10-20ms du côté du mouvement client. Il est à peine notable et devrait dans la plupart des cas correspondent à la position réelle des joueurs.
Ma conception initiale serait similaire à la vôtre, mais si cela ne fonctionne pas, vous pourriez peut-être permettre au client de faire tout le mouvement et de faire une vérification du serveur de gamme. P>
Donc, si votre dernière position signalée était X, le suivant doit être dans un rayon de X dans lequel le rayon est basé sur la différence d'horodatage envoyé du client avec les données X, Y. P>
Pour la plupart, cela est juste nécessaire pour détecter la triche. P>
Arrêt, combats, etc. nécessiterait une position d'être envoyée avec l'attaque, et les actions déclenchées par des postes ne seraient déclenchées que lorsque le client a envoyé la mise à jour de cette position mais sera basée sur le serveur. P>
Je ne sais pas que cela aiderait trop, mais cela pourrait arrêter les resynches de jolting que vous verriez de votre algorithme initial. P>
commentaires Réponse: P>
Non, les clients informeraient toujours le serveur de leur position, mais le serveur n'essaierait pas de calculer la position suivante. Cela signifierait que le serveur (et tous les autres clients) serait au moins un cycle d'envoi / de réception en position. p>
Je suppose que je suppose que je dise simplement que le client effectue tout le travail, de déterminer où le personnage est et indiquez au serveur, mais inclure suffisamment d'informations que le serveur peut éventuellement vérifier la validité pour assurer la triche de personne. p>
La détection de triche pourrait même être désactivée pour des performances ou définie sur une vérification au hasard. p>
Remarque: Toutes les informations de collision / position sur les objets dans la plage de déplacement devraient être envoyées au client pour que cela fonctionne. P>
Le serveur ne doit-il pas avoir à recevoir et à re-envoyer des tonnes de messages si tous les clients devaient informer tous les autres clients de leur emplacement actuel?
+1 J'allais faire suggérer la même chose. C'est ce que beaucoup de jeux vidéo multijoueurs populaires font. Le serveur s'assure simplement que tout le monde est synchronisé périodiquement. (Je crois que les jeux de séquences font cela.)
Eh bien, ma première question s'applique toujours. Les clients ne doivent-ils pas envoyer des milliers de messages tout le temps pour garder le serveur à jour avec chaque étape? Suivi du serveur envoyant ces données une à nouveau sur tous les joueurs à proximité.
"Des milliers de messages tout le temps" est un peu exagéré, mais il n'est pas rare qu'un client avise le serveur de sa position 10 fois une seconde environ, et pour le serveur de diffuser une grande partie de cela de manière similaire base fréquente.
De plus, si vous envoyez 10 mises à jour une seconde sur le serveur, vous pouvez ignorer / manquer quelques-uns ici et là avec peu ou pas d'effet indésirable.
Il y a 2 façons que je puisse penser à ce que cela - ayez les commandes de numéro de client sur le serveur et le serveur seront le gardien de la carte ultime. p>
ou, gardez les cartes des clients et les clients devront établir des connexions avec d'autres clients, ils sont "proches" afin de faire du mouvement, avec un entretien enregistré effectué par le serveur et vérifié par quelques pairs (pirate informatique Police). P>
intéressant pour moi est la possibilité de surveiller les connexions entre pairs et des pairs qui ont une latence au-dessus d'un certain seuil ne figurent pas dans le jeu. p>
Intéressant, mais ce type de limite de gros combats que P2P ne peut pas gérer que de nombreuses connexions en même temps - vous comptez également sur la connexion du client pour d'autres clients. Je cherche toujours le meilleur serveur <> client.
Pourquoi P2P ne peut pas gérer de nombreuses connexions? Chaque fois que quelqu'un fait quelque chose, vous avez besoin d'une rediffusion du serveur ou d'un message de la pair. Je pensais que le trafic était proche de la même chose (je pouvais me tromper).