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?
la source
Réponses:
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.
la source
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.
la source
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:
la source
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.
la source