Questions pour gérer un univers persistant

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Répondre
Avatar de l’utilisateur
KassaK
Messages : 51
Inscription : 29 Sep 2014 14:27

Questions pour gérer un univers persistant

Message par KassaK » 05 Déc 2018 18:57

Salut,

Je suis en train de me renseigner sur la meilleure manière de mettre en place le multijoueur dans mon jeu, et je me suis fait un peu mal à la tête hier soir. Je viens donc demander des conseils/avis ici !

Mon besoin : j'ai un univers (dans le sens avec des galaxies, étoiles...) que je dois rendre "online" et que je dois persister. C'est à dire un même univers pour tous les joueurs, chaque fois qu'un joueur fait quelque chose (récolte une ressource, gagne un niveau etc...) c'est visible par tout le monde (dans le cas de la récolte, la ressource disparaît pour les autres joueurs).
Toutes les infos du joueur doivent être sauvegardées et récupérées quand il reviendra sur le jeu (ses stats, son inventaire, ses constructions etc...).
Le jeu est un jeu de gestion en 2D.

Je n'ai pas besoin d'avoir un temps réel de malade, il n'y aura pas d'interaction directe entre les joueurs, pas de combats, peut être au maximum un échange direct de ressources entre 2 joueurs connectés, donc niveau latence j'ai pas besoin d'avoir un truc de fou.

Comment vous feriez ça ?

J'ai passé la soirée d'hier à étudier Photon, mais son système de lobby et room ne correspond pas du tout à ce que je veux faire. Je ne veux pas X joueurs par room, mais tous les joueurs dans la même instance. Il ne gère pas non plus la persistance de données...
Est-ce que Photon (ou une de ses milliards de produits/api différents) pourrait convenir à mon besoin ?

Dans le cas de le persistance des données je sais qu'il est possible d'utiliser une BDD externe et de tout enregistrer dedans. Mais concrètement comment ça se passe, je vais devoir envoyer du json dans tous les sens toutes les 2 secondes ? Un joueur récolte une ressource BIM, j'appelle mon api et j'enregistre l'info en base. Un joueur se déplace BIM j'appelle mon API et j'enregistre l'info en base etc.... C'est pas un peu lourdingue ?

Je suis dev back end sur Symfony/Laravel de profession, donc bricoler une API pour enregistrer/récupérer des données dans une base SQL est très facile pour moi donc se serait la solution idéale, mais j'ai l'impression que ça va être lourd à mettre en place vu la masse d'info que je dois sauvegarder.

Faut-il coupler plusieurs solutions ? Comme Photon (si ya moyen de bypass son système de lobby et room) + un système de persistance dans une BDD via une API ?

Bref, si vous voulez bien m'éclaircir sur tout ça se serait sympa :) Tout ceci me semble assez lourd à mettre en place et je n'ai pas envie de partir sur une mauvaise solution... histoire de ne pas perdre de temps !

Merci !

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: Questions pour gérer un univers persistant

Message par Farstone » 06 Déc 2018 12:26

KassaK a écrit :
05 Déc 2018 18:57
Comment vous feriez ça ?
En utilisant un système client -> serveur -> client
De toutes façons si tu veux un online sécurisé ta pas vraiment le choix, les cloud que ne tu possède pas et le peer to peer c'est à oublier.
Soit tu créer ton serveur en utilisant une api low level, ou alors tu utilise une bibliothèque qui te permet de gérer ton serveur et les messages qui y transite, pour ce qui est de photon tu a photon server mais je déconseille car je ne voie pas l'utilité de payer pour coder son serveur de A à Z (ou peux être de B à Z :lol: )
Il me semble que forge networking pourrait te convenir, c'est une api high level qui possède déjà un système de gestion des packets et des messages, il est passé gratuit et open source il y a quelques temps, de plus ils ont un discord ou tu peux discuter avec des très bon network programmer.

Sinon pour les données c'est plus ou moins ce que tu pense, après tu à plusieurs manière de gérer la sauvegarde, par exemple tout les X temps tu enregistre toutes les données des joueurs (qui sont normalement déjà stocker en mémoire sur ton serveur) ou a chaque actions, le problème du temps c'est que si ton serveur crash tu risque de perdre des données, et par actions tu risque de perdre en performance. Déjà ils faut savoir quel est la capacité de ton serveur, par exemple si il a une très bonne bande passante tu peux envoyer t'es données à une bdd distante (sa évite de solliciter ton processeur pour faire tourner la bdd), mais si sa connexion et tout juste suffisante pour gérer les joueurs, mieux vaux sauvegarder en local sur une bdd offline comme sqlite.

Avatar de l’utilisateur
KassaK
Messages : 51
Inscription : 29 Sep 2014 14:27

Re: Questions pour gérer un univers persistant

Message par KassaK » 06 Déc 2018 19:18

Twiixy a écrit :
06 Déc 2018 12:26
KassaK a écrit :
05 Déc 2018 18:57
Comment vous feriez ça ?
En utilisant un système client -> serveur -> client
De toutes façons si tu veux un online sécurisé ta pas vraiment le choix, les cloud que ne tu possède pas et le peer to peer c'est à oublier.
Soit tu créer ton serveur en utilisant une api low level, ou alors tu utilise une bibliothèque qui te permet de gérer ton serveur et les messages qui y transite, pour ce qui est de photon tu a photon server mais je déconseille car je ne voie pas l'utilité de payer pour coder son serveur de A à Z (ou peux être de B à Z :lol: )
Il me semble que forge networking pourrait te convenir, c'est une api high level qui possède déjà un système de gestion des packets et des messages, il est passé gratuit et open source il y a quelques temps, de plus ils ont un discord ou tu peux discuter avec des très bon network programmer.

Sinon pour les données c'est plus ou moins ce que tu pense, après tu à plusieurs manière de gérer la sauvegarde, par exemple tout les X temps tu enregistre toutes les données des joueurs (qui sont normalement déjà stocker en mémoire sur ton serveur) ou a chaque actions, le problème du temps c'est que si ton serveur crash tu risque de perdre des données, et par actions tu risque de perdre en performance. Déjà ils faut savoir quel est la capacité de ton serveur, par exemple si il a une très bonne bande passante tu peux envoyer t'es données à une bdd distante (sa évite de solliciter ton processeur pour faire tourner la bdd), mais si sa connexion et tout juste suffisante pour gérer les joueurs, mieux vaux sauvegarder en local sur une bdd offline comme sqlite.
Merci pour ta réponse, mais ça m'aide pas trop :p

Déjà oui utiliser un outil comme photon ou smartfoxmachin je pense que ça va très vite me gaver, forge network c'est un peu pareil je suis tombé dessus hier ça à l'air très complet et les gens ont l'air content, mais je ne vois pas vraiment ce qu'il fait exactement et si c'est adapté à mon cas. (et pourquoi c'est différent d'un photon par exemple). Vous allez me dire que comme c'est gratos j'ai qu'à tester, et vous avez peut être raison !

J'ai passé la soirée d'hier à essayer de faire communiquer un serveur (un laravel en PHP + socket.io) avec mon client unity en C# via les websockets et je n'ai réussi qu'à péter un câble. Coté Unity je n'arrive simplement pas à comprendre comment écouter le serveur.
Chaque fois que je tombe sur un morceau de code ou un tuto, soit c'est deprecated, soit il faut compiler mille trucs pour générer des .dll (je suis sous linux donc c'est impossible)... bref j'ai bien galéré et je n'ai toujours pas réussi.

Est-ce que c'est une bonne piste d'utiliser les websockets entre client (Unity) et Serveur ?

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: Questions pour gérer un univers persistant

Message par Farstone » 07 Déc 2018 14:19

Pourquoi forge est différent de photon ?
Car il te permet de gérer ton code côté serveur en plus du client, ce que le cloud de photon ne te permet pas de faire et t’empêche d'avoir un système sécurisé.

La communication TCP et UDP est très différente, tu devrais commencer par préciser exactement la quel tu veux utiliser, car ton premier post laisser penser que tu voulait de l'UD¨P mais ensuite tu nous parle de websocket qui est du TCP sans connexion continu entre le client et le serveur (pas d'alive packet) :super:

Avatar de l’utilisateur
KassaK
Messages : 51
Inscription : 29 Sep 2014 14:27

Re: Questions pour gérer un univers persistant

Message par KassaK » 07 Déc 2018 15:08

Je suis en train de tester Forge histoire de voir ce qu'il a dans le bide, on verra bien.

Et entre TCP/UDP, aucune idée :p Je suis développeur back et je suis une bille dès que ça commence à toucher le coté réseau !

Concernant forge, j'ai capté le principe j'arrive à faire communiquer un client et un serveur, me reste à voir comment gérer la persistance, est-ce que je continu dans l'idée de gérer ça via une API en php et une BDD en SQL ou est-ce qu'il y a mieux.
Me reste aussi à comprendre comment installer un serveur en standalone qui tourne H24 (que j'héberge moi même) et faire automatiquement pop les gens dessus. Si j'ai bien compris ils appellent ça Master Server.

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: Questions pour gérer un univers persistant

Message par Farstone » 10 Déc 2018 20:14

Justement, Forge t'évite de devoir passer des mois à développer ta propre architecture client-serveur, souvent semé d’embûche, c'est un gain de temps considérable et te permet de te concentrer sur le gameplay.
Pour la BDD, tout ça est possible directement en C# pas besoin de passer par un webserver, étant donné que tu fait confiance à ton serveur tu peux appeler ta base de donnée directement à partir de celui-ci.
Pour ce qui est du serveur ouvert h24 c'est déjà gérer, je te laisse fouiller un peu google pour te renseigner sur les application headless et batchmode avec Unity, ça te permet de ne pas initialiser la carte graphique, il est aussi possible d'avoir une console en headless/batchmode, pratique pour accepter des commandes et voir ce qu'il se passe, ensuite tu met ça sur un vps ou n'importe quel machine et le tour est joué.
Ensuite pour le master serveur c'est surtout si tu cherche à permettre au joueurs de créer leur propre serveurs mais garder un contrôle dessus, c'est utile aussi pour stocker tout les serveurs disponible et l'afficher au client (ou crée un système de auth), là par exemple ça pourrait être intéressant d'utiliser du php pour rapidement gérer tout ça.

Avatar de l’utilisateur
KassaK
Messages : 51
Inscription : 29 Sep 2014 14:27

Re: Questions pour gérer un univers persistant

Message par KassaK » 11 Déc 2018 15:26

Yes j'ai fais des tests avec le serveur forge en headless, j'ai pu le faire tourner sur mon linux et me connecter dessus depuis mon client Unity, me semble que c'est ce que je cherchais.

J'ai eu un problème étrange, je n'arrivait à me connecter qu'une seule fois dessus : je démarre mon serveur en headless, je lance un client via Unity et je me connecte dessus, je lance un second client via Unity et j'essaye également de me connecter dessus et on dirait qu'il écrase le 1er client qui était connecté. J'ai pas poussé plus que ça le bordel.

Pour la BDD oui je sais que c'est possible de faire ça directement en C#, mais je préfère utiliser une API en PHP derrière via Laravel/Symfony, je connais bien cette techno et niveau validation et traitement de données je pense que se sera un peu plus efficace que de faire ça en C#. J'envoie des datas "brutes", je traite ça coté PHP et j'envoie une réponse.

En faisant dans ce sens ça me permet également d'avoir un contrôle sur le jeu depuis mon serveur, je peux update directement des parties du jeu sans devoir re-build tout le bazar.

Farstone
Messages : 187
Inscription : 04 Déc 2016 09:38

Re: Questions pour gérer un univers persistant

Message par Farstone » 12 Déc 2018 03:28

Le problème avec une tel configuration c'est que tu te retrouve avec des relais de serveurs (client->forge->webserver->bdd), augmentant le temps de réponse, la difficulté à sécuriser et maintenir tout le parcourt, à moins que tout cela tourne sur le même serveur évidemment, mais le CPU risque d'être chargé, il y aussi d'autres points que je vais essayer d'expliquer sans trop m'éparpiller :taistoi: .

Je ne connait pas la config de ton jeu mais tout ça tu doit y faire gaffe et y réfléchir avant le développement, si ton objectif est de gérer 1 millier de joueurs par exemple, il serrais intéressant de baisser la fréquence d'update du serveur (voir la doc de ton api) car tu va surement avoir des messages routinier qui sont envoyé automatiquement (comme la position des transforms et autres données de ce type), comme c'est messages sont susceptible de passer par PHP c'est d'autant plus de charge de tout les côtés.

Il ne faut pas oublier la sérialisation des données aussi, Forge fait tout ça pour toi à l'envoi et à la réception de packet, mais comment compte tu réduire la taille de t'es messages entre ton serveur forge et PHP sans dégradé la fluidité de toute la route ?

Ce que je veux dire par là c'est que quand tu fait une requête MySQL sur PHP par exemple, tout est sérialiser pour éviter la redondance et optimiser les données de la même manière que Forge, mais ça n'est pas le cas nativement entre Forge et PHP car le type de données est imprévisible, si t'es motivé tu pourrait surement trouver une api pour sérialiser du json en c#, le dé sérialiser sur PHP et l'interpréter, mais dans ce cas là comment éviter l'overhead lié à la dé sérialisation par forge et la ré sérialisation pour l'envoi au serveur PHP alors qu'ont pourrait envoyer le même packet au 2 ?
Je ne sait pas si je me suis bien exprimé mais en gros le PHP fous la merde pas possible dans cette architecture :lol: , j'essaie pas de te démotiver mais plutôt de t'exposer certains problème potentiel que tu aurait pu loupé.

Une solution envisageable serrait d'envoyer les données persistante directement en c# sur MySql et d'envoyer de très léger messages sur PHP pour gérer l'univers et avoir des infos sur celui-ci, dans ce scénario tu n'a plus besoin d'envoyer des tonnes de données sur PHP et ta route utilise seulement 2 relais qui sont Forge et MySQL (MySQL étant seulement là pour la sauvegarde persistante, tu n'a même pas besoin d'attendre le traitement avant de continuer avec Forge).

Tout ceci est à prendre avec pincettes, j'ai jamais eu à faire à ce style de configuration mais ça vaux le coup de se renseigner, bon courage pour la suite, j'ai bien ri en lisant les feedbacks sur ton site :merci: .

Avatar de l’utilisateur
KassaK
Messages : 51
Inscription : 29 Sep 2014 14:27

Re: Questions pour gérer un univers persistant

Message par KassaK » 13 Déc 2018 13:08

Merci pour les feedbacks, garanti no fake !

Je vois ce que tu veux dire pour l'API en PHP, autant attaquer directement la BDD en C# ça fait en effet un intermédiaire de moins. Je viens du Web donc j'ai un peu de mal à me passer des technos que j'utilise régulièrement.
Faire du SQL en C# ça a quand même l'air bien chiant, sur des frameworks PHP comme Laravel ou Symfony on utilise des orms qui se placent entre l'appli en PHP et la BDD, on écrit plus les requêtes SQL à la main mais on utilise les fonctions de l'ORM qui les génère ensuite pour nous => gain d'un max de temps !

Une table dans la base = un fichier de migration (pour générer la structure) + un fichier de validation de données (pour dire que tel champ n'accepte que les string de 5 caractères par exemple), on utilise l'orm ensuite pour injecter les données sans se prendre la tête de vérifier que telle donnée est bien dans le format qu'on attend et si ça colle pas avec le fichier de validation on a une erreur.

Bon j'ai fais des recherches vite euf pendant que j'écrit, il existe ce genre d'ORM en C#. J'avais peur de devoir repasser à l'écriture des requêtes SQL à la main à l'ancienne mais apparemment on peut trouver quelque chose de similaire à ce que je connais coté PHP, je vais tester ça, c'était ce qui me bloquait.

Bon en tout cas merci de prendre du temps pour répondre, ça m'aide pas mal à y voir plus clair :p

Avatar de l’utilisateur
ZJP
Messages : 5745
Inscription : 15 Déc 2009 06:00

Re: Questions pour gérer un univers persistant

Message par ZJP » 13 Déc 2018 15:13

Bonjour,


Vu que le temps réel n'est pas requis (cela semble plutôt du tour par tour), pourquoi ne pas faire un essai en conservant ce que tu maitrises (la partie PHP, BDD etc.. ) et "mixer" cela avec des commandes POST/GET du coté d'Unity? .
Si cela ne fonctionne pas, tu pourras alors envisager autre chose. ;-)

Répondre

Revenir vers « Unity le logiciel »