Simulations physiques côté serveur avec des centaines de joueurs

9

Je travaille actuellement sur un jeu orienté physique en solo où j'aimerais que la physique soit simulée côté serveur. Cela parce que le jeu aura des classements, une progression persistante des joueurs, etc. et je veux empêcher tout type de tricherie - essentiellement une architecture client-serveur pure, le client est "stupide" et n'affiche que ce que le serveur veut que vous affichiez.

Le problème est cependant que le jeu sera probablement joué par des centaines (voire des milliers) de personnes en même temps. Cela me préoccupe, car cela va probablement tuer la puissance de traitement du serveur si je dois faire et maintenir des centaines d'états en même temps.

Je n'aurais aucun problème à déplacer toutes les simulations physiques du côté client, mais j'aurais alors vraiment besoin d'un moyen de valider si le résultat d'une simulation client est valide. Cependant, je ne peux pas comprendre comment.

J'ai pensé à exécuter la simulation côté serveur de temps en temps pour valider si le client joue toujours correctement, mais je veux vraiment que le serveur ait le moins de tension possible.

La physique deviendra à peu près aussi complexe que la démo GDC 2011 de Glenn Fiedler , peut-être même plus simple. Cependant, beaucoup de corps rigides toujours en collision seront dans une seule scène et ils seront tous visibles à la fois.

J'ai du mal à obtenir une réponse à ce cas particulier, car la plupart des ressources sur le Web - encore une fois, le site de Glenn Fiedlers étant génial - parlent de physique en réseau à petite échelle (par exemple, un FPS avec 30 joueurs, comme Halo).

Tout conseil, site Web, article ou autre sur le sujet sera très apprécié.

Un récapitulatif des questions auxquelles je voudrais une réponse:

  • Quelle est la faisabilité d'un modèle client-serveur? Ma préoccupation de puissance de traitement de serveur est-elle légitime et fondée?
  • Est-il possible de valider de manière fiable une simulation physique exécutée par le client sur le serveur? Si c'est le cas, comment?
Lennard Fonteijn
la source
Je vais laisser cette question ouverte un peu plus longtemps dans l'espoir que plus de gens publieront leurs réflexions. Mes remerciements vont à ceux qui l'ont déjà fait!
Lennard Fonteijn
Tant que les différents clients sont indépendants, vous ne devriez avoir aucun problème de mise à l'échelle horizontale. Utilisez quelque chose comme EC2, mettez la capacité en ligne au besoin.
ipeet
1
Où est le problème si quelqu'un triche dans une partie solo? Laissez-les, mieux vaut abandonner l'idée du classement et se concentrer sur la création d'un jeu solo amusant
Maik Semder
2
"Est-il possible de valider de manière fiable une simulation physique exécutée par le client sur le serveur?" Oui, il est possible de le valider, mais en lisant vos commentaires ci-dessous: Votre intention de distribuer de l'argent RL aux meilleurs scores, et c'est similaire à un jeu de fléchettes, c'est-à-dire après le premier lancer de la physique. Le problème ici est moins de valider la physique, c'est facile. Le problème est que vous aurez des tricheurs qui laisseront un programme informatique faire le coup pour leur donner des scores parfaits.
Daniel Carlsson
La physique validée par serveur dans un monde partagé est tout à fait possible, DCUO en est un bon exemple. Veuillez noter que «serveur» signifie vraiment «un tas de boîtiers de serveurs» alors que vous semblez écrire en termes de «serveur» étant une seule boîte assise quelque part. Vous ne pouvez pas actuellement simuler des milliers d'acteurs indépendants dans le même espace physique, d'où le manque de discussion à ce sujet; vous pouvez répartir des milliers de joueurs dans des îlots de simulation indépendants qui n'interagissent pas.
Patrick Hughes

Réponses:

5

Vous pouvez valider côté client les soumissions d'autres utilisateurs et demander au client de signaler au serveur si une soumission semble non valide.

Ensuite, vous pouvez prendre des mesures (interdire le tricheur ou interdire qui a contrefait le faux rapport). Pour vérifier si cette soumission est vraiment invalide ou non, vous pouvez utiliser un client spécial ou autre.

o0 '.
la source
3
C'est vraiment sacrément intelligent! N'aurait pas pensé à cela, évidemment au moins 2 ou 3 clients devraient exécuter la simulation au cas où le client exécutant quelqu'un d'autre sa simulation triche - auquel cas le serveur peut toujours faire la simulation finale si tous les clients rapportent quelque chose de bizarre .
Lennard Fonteijn
1

Votre jeu est en solo, la seule «interaction» avec les autres joueurs est un leaderbord. Vous pouvez générer une instance pour vérifier une simulation sur votre serveur pour chaque soumission, vous n'avez pas besoin de toutes les astuces pour vous assurer que la physique est la même sur 30 clients, donc je ne pense pas que vous ayez besoin de plus de ressources que vous n'en avez déjà depuis. la physique fonctionne déjà :).

Vérifier chaque résultat va être un peu exagéré, vous pouvez envoyer la simulation compressée au serveur chaque fois que quelqu'un envoie un score au leaderbord, puis ne vérifier que les 5% des meilleurs scores sur votre propre serveur, ou peut-être même le 1% supérieur ou même plus intelligent ne vérifie que les nouveaux scores et suppose que tout le monde n'est pas meilleur que le n ° 1 a probablement une simulation non trichée.

Je ne sais pas si votre simulation est similaire, configurée et n'interagit pas (facile à vérifier) ​​ou si les joueurs peuvent interagir avec la simulation pendant son fonctionnement, mais assurez-vous de faire votre physique de telle manière que différents flottants les représentations ponctuelles ne gâchent pas les choses et rendent une exécution valide non valide.

Roy T.
la source
Je ne veux pas entrer dans les détails du gameplay lui-même, mais vous pouvez comparer mon jeu à celui du jeu de fléchettes: une fois que vous avez visé et effectué le lancer, la physique prend le dessus et vous ne pouvez rien y changer plus. Cette connaissance changerait-elle votre réponse?
Lennard Fonteijn
Non, cela ne changerait rien :). Il suffit de stocker les rediffusions sur le serveur et de ne vérifier que celles qui sont suspectes (par exemple, les nouveaux meilleurs scores)
Roy T.
1

Ne le faites pas, je peux vous assurer que simuler la physique uniquement sur le serveur est une très mauvaise idée. Le problème principal n'est pas la charge du serveur, mais la réactivité. La réactivité du client sera incroyablement médiocre. Le joueur frappera un bouton, puis vous devrez faire un aller-retour vers le serveur avant d'obtenir les résultats de la simulation. J'ai fait des variations de cela dans le passé (principalement des pressions sur des boutons), et les résultats ne sont pas jolis et ne devraient être faits que pour des jeux très lents qui ont des chances de s'en tirer (et même dans ces cas, la perception le manque de réactivité est un énorme problème).

Un meilleur schéma que je comptais essayer la prochaine fois que ce type de scénario se présenterait consiste à sélectionner les joueurs un très petit sous-ensemble de votre base de joueurs, puis vous simulez pour eux côté serveur pendant un court instant et comparez vos résultats aux leurs, à leur insu. S'ils s'écartent de beaucoup (vous devez vous attendre à certains degrés de divergence), vous les classifiez comme des tricheurs potentiels et continuez à les simuler pendant un certain temps pour confirmer. Ce que vous obtiendrez est une sorte de courbe selon la différence entre un joueur légitime et le serveur, influencée par les conditions du réseau, etc., et vous verrez rapidement que les tricheurs sont en dehors de cette courbe. Ce système présente les avantages suivants:

  • automatique
  • Vous ne sacrifiez pas la réactivité
  • Comme vous simulez simplement un très petit sous-ensemble de votre base de joueurs, la charge sera gérable, et même évolutive (peut-être que vous choisissez moins de joueurs à simuler si la charge est élevée)
  • Applicable à tous les jeux auxquels je peux penser, donc très réutilisable
Ylisar
la source
Donc, comme Roy, vous dites essentiellement: Gardez-le côté client, stockez les "replays" lorsque les clients soumettent un score et ne validez ces replays que de temps en temps (pas tous, un petit pourcentage). Que se passe-t-il si sur la base du score le client soumet qu'un paiement est effectué - la partie progression du joueur, les crédits peuvent également être achetés avec de l'argent réel (!!!) - recommandez-vous toujours cette approche? Si la tricherie donne des crédits excessifs et que je ne valide que de temps en temps, je perdrais essentiellement de l'argent. Vous pouvez probablement signaler une personne lorsque son score est supérieur à un certain seuil, mais y aurait-il une meilleure façon?
Lennard Fonteijn
Si le moteur physique est déterministe (il devrait l'être) et que le serveur simule en utilisant le même état de démarrage et les mêmes entrées que le client (ce qui devrait être faisable), les résultats doivent être dans des limites d'erreur à virgule flottante raisonnables (insignifiantes). Même s'il y a des effets aléatoires, et qu'il n'est pas possible de passer sur l'état RNG, vous pouvez passer sur les nombres aléatoires et les utiliser pour vérifier (et même vérifier leur distribution, au cas où le fudging rouleaux aléatoires ferait une grande différence de gameplay) .
ipeet
Certains crédits sont impliqués, vous feriez mieux de vérifier chaque rediffusion, car la triche n'est plus de se hisser au sommet de la liste des meilleurs scores mais de gagner de l'argent. Vous voulez beaucoup plus de sécurité si de l'argent est en jeu, je ne peux pas vous y aider.
Roy T.
@RoyT. Je le ferai probablement de toute façon, même si je ne paie pas d'argent en fonction des crédits (quelqu'un a mal lu, je suppose?). J'ai l'intention d'avoir une politique de tolérance zéro, donc je viens de regrouper le fichier de relecture pour validation. Si c'est vraiment suspect, je prends des mesures.
Lennard Fonteijn
1

Comme Daniel l'a déclaré, le gros problème ici sera les programmes qui exécutent l'action pour le joueur; aucun biais physique en jeu ne serait nécessaire si le joueur était un bras robotisé avec une résolution normalement résolue pour la neurochirurgie.

Un gars
la source
J'aurais peut-être été un peu flou. Mes jeux vous accorderont des crédits virtuels après avoir terminé un jeu. Vous pouvez utiliser ces crédits pour débloquer de nouveaux contenus avec lesquels jouer. Vous pouvez également utiliser de l'argent réel pour acheter des crédits pour déverrouiller du contenu plus rapidement (sachez que ce n'est pas Pay2Win, je déteste ça). Je n'ai aucune intention de payer de l'argent réel sur la base de crédits. Cela dit, les fléchettes n'étaient qu'un métaphore pour décrire l'influence d'un joueur sur l'état des corps rigides, je n'ai pas peur des "aimbots" car cela vous donnera 0 avantage.
Lennard Fonteijn