2012-12-11 5 views
2

Ok, donc je me rends compte que cela a été discuté encore et encore car j'ai lu un nombre incalculable de threads Stack Overflow, et des articles sur le web. J'ai actuellement un TCP Asynchronous C# .NET Server fonctionnant sur un VPS.TCP en temps réel multijoueur

Je l'ai obtenu pour bien travailler pour les lobbies multijoueurs tels que la connexion des joueurs au jeu et quoi d'autre. Mon problème principal est quand le jeu commence, car il devient vraiment bloquant. Donc sur ma recherche

J'ai trouvé quelques fils très utiles sur l'interpolation dans laquelle ils m'ont guidé vers un basique (différence (Serverpos - Localpos) * Deltatime (Temps entre les mises à jour de serveur?) * Constante d'interpolation). Cela a fonctionné dans le sens où il a atténué la fréquence d'images, mais j'ai toujours eu un décalage momentané sur les temps de mise à jour du serveur. Cependant, mon problème principal est que j'utilise l'accéléromètre pour mettre à jour la position de chaque lecteur, mais mon serveur ne peut pas recevoir ces données et les traiter aussi vite que l'accéléromètre se met à jour, ce qui provoque le démarrage.

Aujourd'hui, j'ai simplement essayé d'envoyer des données au serveur, mais mon temps de transfert maximum est d'environ 350MS, ce qui l'empêche de combiner des messages accidentellement.

Je suis alors tombé sur "Dead Reckoning", ce qui fonctionnerait en théorie cependant puisque vous ne garderiez pas trace des positions de pagaie à jour en théorie. Que se passe-t-il lorsque la balle frappe votre adversaire? Soufflez-vous automatiquement la pagaie en position et inversez-vous la position de la balle? Fondamentalement, je pense que je me suis lancé dans un grand cercle, en théorisant simplement différentes façons de le faire. Je suis également conscient de UDP, mais je ne peux pas imaginer un multijoueur Pong me demanderait d'exécuter une connexion UDP, il doit y avoir un moyen d'utiliser TCP.

Quoi qu'il en soit, merci pour l'aide que vous m'avez donnée. Je suis nouveau à cela et je pense que je me suis perdu dans le réseau de réseautage.

+0

C'est assez vague. Avez-vous une question sur l'un de ces algorithmes ou techniques dont vous parlez? Sinon, il n'y a pas de question ici, et en tant que telle, il n'y a vraiment pas de «réponse» à cela. Je vois en quelque sorte une question dans le paragraphe sur le "compte à rebours", peut-être pourriez-vous vous concentrer sur cette question en particulier? –

+0

Désolé, je suppose que ma question serait sur la façon dont les gens parviennent à un jeu en douceur avec TCP. Est-ce que j'enverrais des positions de pagaie tous les 350MS tout en simulant la balle au niveau du client. Ensuite, utilisez simplement la navigation à l'estime pour les pagaies pendant les périodes de mise à jour? Désolé d'être vague. – peytoncas

Répondre

3

Ce n'est pas un problème de mise en réseau, c'est un problème de filtre. Je recommande de lire sur "Kalman Filtering". Le calcul peut être intimidant, mais le problème de base que vous essayez de est « comment j'interpoler état basé sur ma connaissance de la physique de mon système et (éventuellement) des mesures bruyantes et irrégulières des entrées utilisateur et états précédents » .... Cela arrive à être le problème classique de Kalman.

1) Vous devez établir une "heure" commune avec laquelle le serveur et le client sont d'accord. Il y a quelques algorithmes bien connus pour faire ceci. Horodatage de toutes vos mises à jour avec ce temps commun. 2) L'utilisation de UDP est la solution: gardez à l'esprit que les paquets peuvent être perdus et qu'ils ne sont pas garantis d'être reçus dans l'ordre où ils ont été envoyés. Cela signifie que vous devez avoir un moyen d'inspecter les paquets et de décider s'ils sont "vieux" avant de les utiliser pour mettre à jour vos clients. Vous avez également le problème que si vos clients ne peuvent pas les traiter aussi vite qu'ils sont envoyés, vous commencerez à obtenir de grands deltas vos clients .... mieux de jeter un paquet qui est vieux que de passer du temps de traitement, il .

3) Minimiser la latence. Si vous le pouvez, supprimez totalement votre serveur et demandez à vos clients de se mettre à jour les uns les autres. 4) C'est là qu'intervient la théorie du filtre - pour chaque degré de liberté, décidez quelle erreur vous êtes prêt à tolérer (différence entre ce que voit un client et «vérité»). Par exemple, pour un avion, la position n'est pas très dynamique - vous pourriez probablement vous en sortir avec une ou même deux secondes mises à jour et avoir très peu d'erreur de position dans les clients. Cependant, l'attitude (tangage, lacet, roulis) est très dynamique, vous devrez donc mettre à jour ces états tous les jours.25 secondes pour obtenir une erreur de position acceptable. La théorie de Kalman vous dira quel doit être le taux de mise à jour pour obtenir l'erreur dont vous avez besoin. Vous pouvez également modifier votre taux de mise à jour en fonction de ce que vous savez sur le client d'origine .... entrées de commande rapide => taux de mise à jour élevé par rapport à aucune entrée de commande => taux de mise à jour faible.

+0

D'accord, je n'ignore pas la théorie de Kalman, car elle est certainement intéressante. Cependant, je pense que, pour des raisons de coût/efficacité, il serait préférable de simplement mettre en œuvre une connexion UDP et de faire en sorte que le serveur synchronise les clients. Merci aussi pour le conseil de Kalman semble intéressant pour l'apprentissage à long terme juste besoin d'obtenir cette mise en œuvre rapidement. – peytoncas