Données d'un jeu vidéo

a marqué ce sujet comme résolu.

Bonjour Je suis en train de développer un jeu vidéo, et je me suis posé la question des données. Je m’explique, si j’ai besoin d’avoir une sauvegarde local, disons sur Windows ou sur mobile, comment faire pour sauvegarder des données (progression, scores..), sqlite, en format txt, json…? Pareil si j’ai besoin d’une sauvegarde en ligne, (j’imagine plus mysql)?

Comment les grands studios professionnels font pour sauvegarder, en local et en ligne ?

Je vois passer un peu de tout, chaqu’un a sa petite idée, mais l’idéal ça serait quoi ?

(petite précision je maîtrise mysql, sqlite et json)

+0 -0

Salut,

Rien ne t’est imposé. Ce que tu cherches à faire est de la sérialisation. C’est l’action de transformer des données quelconques, stockés en mémoire la plupart du temps, vers une suite d’octet à entreposer ou envoyer. L’action inverse est bien sûr toujours à implémenter (sinon on se retrouve avec un stockage en écriture seule). :-)

Tu mentionnes Godot en tag, qui possède son mécanisme. Cf tutoriel.


La manière la plus simpliste est d’écrire un bout du contenu de la mémoire dans un fichier. Ça pose par contre des soucis

  1. de versionnage : et si tu faisais une mise à jour de ton jeu ?
  2. de compatibilité entre les ordinateurs : tous n’encode pas les nombres entiers de la même manière.

À vrai dire, le point (1) est une galère dans tous les cas.


Pour résumer, tu vas devoir choisir (1) un format de stockage et (2) une librairie qui effectue la conversion dans les deux sens, potentiellement écrite par toi-même.

Salut,

Pareil si j’ai besoin d’une sauvegarde en ligne, (j’imagine plus mysql)?

NRG

Qu’est-ce que tu veux dire par en ligne ?
Si tu parles des données d’un mmo par exemple, c’est le serveur qui va les gérer et s’assurer qu’elles soient persistante en cas de crash, reboot ou maj. Avec du MySQL pourquoi pas mais ce n’est pas le client qui va s’y connecter directement, pour éviter qu’il puisse faire n’importe quoi avec les données, il y a un contrôle du serveur de jeu.
Si tu parles juste de pouvoir jouer sur différentes machines voire différentes plateformes, généralement la sauvegarde est conçue comme une sauvegarde locale et le fichier est ensuite synchronisé avec des technologies cloud (Steam Cloud, GOG Cloud etc…)

Comment les grands studios professionnels font pour sauvegarder, en local et en ligne ?

NRG

Je pense qu’avec l’expérience y’a des bonnes pratiques qui se dégagent, mais je crois bien que chacun fait à sa sauce.

Je vois passer un peu de tout, chaqu’un a sa petite idée, mais l’idéal ça serait quoi ?

NRG

Je crois que la raison pour laquelle tu vois passer de tout c’est qu’il n’y a pas d’idéal. Il faudrait que tu te fixes des caractéristiques souhaitable et l’idéal c’est que tu y réponde au mieux. Par exemple les caractéristiques d’évolutivité avec la gestion des versions et de compatibilité machine qu’évoque tleb, ou la caractéristique de performance avec le temps de chargement…

+1 -0

Tu mentionnes Godot en tag, qui possède son mécanisme. Cf tutoriel.

Effectivement, je parlais pour Godot. Super je vais y jeter un oeil, merci.

C’est pour cela qu’un fichier JSON c’est bien flexible, et ça me semble une bonne idée.

Par contre le soucis, est qu’est qui empêche un joueur de le modifier pour se booster ou autre?

Dans l’idéal, il faudrait le crypter ou quelque chose du style

Techniquement si le programme qui génère la sauvegarde est sur la machine de l’utilisateur, tu ne pourras jamais l’empêcher de modifier la sauvegarde.
Tu peux chiffrer (pour empêcher de lire la sauvegarde), signer (pour empêcher de la modifier), obfusquer d’une manière ou d’une autre la sauvegarde ou le code qui la génère : tant que le programme qui le fait tourne sur la machine, il y a moyen d’analyser ce qu’il fait et de désobfusquer / déchiffrer / reproduire la signature.

Par contre s’il s’agit d’un jeu qui tourne sur une machine distante et te permet d’importer/exporter une sauvegarde sans que tu n’aies d’accès direct à la machine, alors là oui les mécanismes de chiffrement et de signature permettront de protéger cette sauvegarde (car les clés privées ne transiteront jamais sur la machine de l’utilisateur).

Bonsoir,

Tout le monde fait un peu à sa sauce justement parce qu’il n’y a pas vraiment de réponse universelle à mon avis. La nature des données est très différente selon le jeu. Tu ne vas pas du tout stocker la même chose de la même façon pour un jeu de simulation ou un RPg, si le monde où évolue le joueur est toujours le même (map crée à l’avance) ou aléatoire (génération procédurale), etc.

Le point commun entre JSON, SQLite ou autre format de stockage, déjà brièvement évoqué dans un post précédent, c’est que tu vas devoir réfléchir à ce que tu veux sauvegarder comme données, et comment tu vas les structurer. Je te redonne le mot clé: sérialisation. Pour SQLite, tu dois réfléchir en tables, colonnes et enregistrements. Pour JSON, ce sera en tableaux et objets (ou dictionnaires, si tu préfères). Après, ce que tu dois faire exactement dépend trop de ton jeu pour te donner des tuyaux plus précis.

C’est difficile de savoir sans autre information lequel sera le meilleur pour toi, et vu qu’il n’y a pas de réponse unique et universelle, c’est comme pour le choix du langage de programmation, tu aurais en premier lieu intérêt à choisir un format avec lequel tu es à l’aise, pour l’écrire et le lire, dans ou hors de ton jeu, quitte à en changer après coup si tu t’aperçois que le format te complique la vie plus qu’il ne te la simplifie. Dans cette optique, JSON me parait effectivement être un bon choix pour commencer, car il est flexible, simple à utiliser, relativement rapide, et facilement modifiable hors jeu.

L’aspect modifiable en-dehors du jeu n’est pas à négliger, parce que c’est important de pouvoir manipuler rapidement les sauvegardes, notamment pour tester et débugger des éléments précis de ton jeu. Si tu dois trouver un bug qui arrive uniquement en commençant le level 3 avec 1 HP, c’est quand même embêtant si tu dois te retaper les levels 1 et 2 et arriver avec cette situation précise non ?

Pour ce qui est de la triche, l’intervenant précédent avant moi l’a déjà dit, en fait pour un jeu solo, ça ne sert à rien d’empêcher le cheat et le moding. On peut parfois voir apparaître des choses surprenantes voire totalement inattendues, mais au final c’est la vie du jeu qui est prolongée et la communauté qui est renforcée. Dans la mesure où chacun prend uniquement ce qui l’intéresse, ça ne peut jamais être négatif (sauf si le contenu modé est malveillant ou moralement reprochable). C’est pas toujours facile d’accepter ce que les autres ont fait de son oeuvre, cela dit…

Par contre, à partir du moment où tu as une donnée partagée quelque part, tu dois t’assurer que tous les participants qui partagent cette donnée jouent dans les mêmes conditions. Ca commence avec un simple tableau des meilleurs scores, où tu dois par exemple valider uniquement les parties jouées avec le jeu officiel non modifié, ou créer une liste différente pour chaque mod autorisé.

+1 -0

Merci pour toutes vos réponses, j’y vois un peu plus clair.

@entwanne comme tu dis on peut toujours désassembler le programme et récupérer la clé de chiffrement etc.. Mais si mon jeux en arrive à là je serai très content ! il faut qu’il y ait des gens vraiment motivé.., mais pour utilisateur lambada, de ne pas ouvrir simplement le fichier, et s’avantager considérablement, ça me conviendra parfaitement. Des fois il vrai que ça prolonge le jeux mais dans certain jeux c’est tout le contraire (petit exemple qui me vient en tête, imaginons un jeux comme clash royale, si la personne se met directement les meilleurs decks etc… je pense qu’il n’y a plus d’intérêt)

@romantik par en ligne je parlais du style de jeux multijoueurs, ou clash royal etc.. ces types de jeux communiquent avec le serveur soit pour le multijoueurs soit synchronisé en temps réel les données. Pour ce type de jeux, et c’était une seconde partie de ma question comment c’était fait ?

J’ai pu jeter un œil à la doc, et effectivement il a sa propre technique, bon c’est du JSON mais il y a aussi en binaire, ça m’a l’air intéressant, on peut sauvegarder un nœud, mais pas eu le temps de tester de façon approfondis ni de l’implémenter pour me faire un avis.

@QuentinC En gros comme les langages de programmation… c’est intéressant, je ne voyais pas ça comme ça. Pour le cout je n’ai pas de préférence sql ou json, mais je n’ai jamais utilisé dans le cadre de jeux vidéos. En théorie je pourrais même faire mon propre style de base de donnée avec mes propres méthodes ?

+0 -0

Ton jeu est-il un jeu multijoueur ou non ? Parce que comme dit plus haut, ça ne sert à rien de vouloir empêcher la triche sur un jeu qui ne soit pas multi (et compétitif, parce que tricher sur overcooked, en soi ce n’est pas dérangeant non plus quand on joue entre amis).

De ce que j’ai pu voir, globalement, on passe à sqlite quand on a besoin de performances pour stocker un grand nombre d’informations. Ce n’est très probablement pas ton cas.

+1 -0

En gros comme les langages de programmation… c’est intéressant, je ne voyais pas ça comme ça. Pour le cout je n’ai pas de préférence sql ou json, mais je n’ai jamais utilisé dans le cadre de jeux vidéos. En théorie je pourrais même faire mon propre style de base de donnée avec mes propres méthodes ?

Tu peux toujours réinventer la roue si tu veux, mais est-ce que ça en vaut vraiment la peine ? La roue de ta propre fabrication sera forcément moins bien que celles prêtes à l’emploi que tu peux trouver et qui ont été largement éprouvées (à moins que tu sois très doué et que tu aies des idées révolutionnaires, probabilité pas complètement nulle mais très, très, très faible)

Inventer sa propre variante de JSON, ou recréer soi-même une bibliothèque pour lire/écrire du JSON, ça peut être une chouette introduction au parsing, et te donner l’envie de poursuivre avec un mini langage de programmation par la suite, peut-être, pourquoi pas. De même, créer un petit moteur de base de données basé sur SQL, c’est un fantastique moyen de découvrir comment ça marche en interne.

ON peut dire la même chose avec le moteur graphique, le moteur audio, ou n’importe quoi d’autre. On peut même descendre au niveau assembleur, ou carrément au niveau matériel si on veut. Aujourd’hui on trouve à peu près tout si on veut se lancer.

Si ces sujets t’intéressent, essaye, documentes-toi, amuse-toi ! Tu pourrais bien découvrir des mondes fascinants que tu ne soupçonnes même pas. C’est toujours très enrichissant pour sa culture personnelle de s’amuser à réinventer la roue. ON est même meilleur pour utiliser les roues préexistantes après avoir compris comment ça marche et essayé soi-même, c’est prouvé. Par exemple, tu comprends mieux pourquoi certaines choses sont plus performantes que d’autres, pourquoi certaines choses ont été ainsi conçues et pas autrement, les choix que les concepteurs ont fait ou ont dû faire et pourquoi, après t’y être un peu frotté toi-même un peu.

Par contre, si ton objectif est de terminer ton jeu vidéo un jour, réinventer la roue, ça n’a aucun intérêt. Tu te noiras dans des détails et tu n’aboutiras à rien.

Cela dit, ça peut t’arriver à toi aussi. Je me suis moi-même pris de passion pour certains de ces sujets, à tel point que je me suis aperçu que, parfois, ça m’amuse presque plus de créer un moteur/système/outil qui permet aux autres de créer quelque chose, plutôt que de créer ce quelque chose moi-même directement. En d’autres termes ça me passionne presque plus de construire un marteau plutôt que d’en utiliser un pour construire un objet concret. Je ne sais pas si c’est très clair… Mais ça, c’est personnel.

Pour en revenir à nos moutons, si tu cherches un format pour échanger des données en réseau en temps réel, le format JSON peut tout à fait convenir pour un jeu amateur, mais les jeux vidéo ont tous créé leurs propres formats binaires car ça leur permet d’être nettement plus performants, autant en CPU qu’en bande passante, en plus d’évidemment compliquer passablement la triche. Les besoins ne sont pas les mêmes pour des échanges en réseau que pour un stockage.

+1 -0

De ce que j’ai pu voir, globalement, on passe à sqlite quand on a besoin de performances pour stocker un grand nombre d’informations. Ce n’est très probablement pas ton cas.

Moté

Faudrait voir des benchmark, mais je suis pas sûr qu’il y aie un gros désavantage à l’utiliser sur une petite quantité de donnée. Et en revanche ça peut permettre de passer à l’échelle.

Tu peux toujours réinventer la roue si tu veux, mais est-ce que ça en vaut vraiment la peine ? La roue de ta propre fabrication sera forcément moins bien que celles prêtes à l’emploi que tu peux trouver et qui ont été largement éprouvées (à moins que tu sois très doué et que tu aies des idées révolutionnaires, probabilité pas complètement nulle mais très, très, très faible)

[…]

les jeux vidéo ont tous créé leurs propres formats binaires

QuentinC

Je trouve cela un peu contradictoire … lorsqu’on fait un format binaire, on est obligé de réinventer cette roue. Pas parce qu’on est un génie qui fait mieux que tout le monde, non. Simplement parce qu’en faisant un format binaire, on se trouve au plus proche de notre représentation mémoire de notre logiciel et donc d’une structure unique.

C’est encore vrai que la plupart des jeux utilisent des formats binaires ? Je pense que les formats json, xml, sql ont toute leur place dans le milieu.

pour utilisateur lambada, de ne pas ouvrir simplement le fichier, et s’avantager considérablement, ça me conviendra parfaitement.

NRG

Dans ce cas, simplement le signer avec un checksum suffirait, je pense.

@romantik par en ligne je parlais du style de jeux multijoueurs, ou clash royal etc.. ces types de jeux communiquent avec le serveur soit pour le multijoueurs soit synchronisé en temps réel les données. Pour ce type de jeux, et c’était une seconde partie de ma question comment c’était fait ?

NRG

Le client n’a absolument pas accès aux données dans ces jeux. C’est le serveur qui les sauvegarde, les charge, et contrôle la progression du joueur. Par exemple, lorsque le joueur gagne de l’argent, ce n’est pas le client qui déclare "J’ai 100000 balles", c’est le serveur qui informe le client qu’il dispose en fait de 500 balles.

+1 -0

@QuentinC Peut-être passionnant certes, mais pas mon but. J’ai deja, dans ma carrière dû inventer un format de donnée pour communiquer avec mon programme, c’était sympa mais pas mon but de réinventer la roue et de me perdre en chemin. Juste trouver le plus pratique pour moi.

Tu peux toujours réinventer la roue si tu veux, mais est-ce que ça en vaut vraiment la peine ? La roue de ta propre fabrication sera forcément moins bien que celles prêtes à l’emploi que tu peux trouver et qui ont été largement éprouvées (à moins que tu sois très doué et que tu aies des idées révolutionnaires, probabilité pas complètement nulle mais très, très, très faible)

Je suis d’accord pas mon but, juste vouloir utiliser le plus intéressant plus pratique…

Je trouve cela un peu contradictoire … lorsqu’on fait un format binaire, on est obligé de réinventer cette roue. Pas parce qu’on est un génie qui fait mieux que tout le monde, non. Simplement parce qu’en faisant un format binaire, on se trouve au plus proche de notre représentation mémoire de notre logiciel et donc d’une structure unique.

C’est encore vrai que la plupart des jeux utilisent des formats binaires ? Je pense que les formats json, xml, sql ont toute leur place dans le milieu.

Mais godot à sa mehtode en binaire je pense que ça devrait convenir, non ?

pour utilisateur lambada, de ne pas ouvrir simplement le fichier, et s’avantager considérablement, ça me conviendra parfaitement.

NRG

Dans ce cas, simplement le signer avec un checksum suffirait, je pense.

Oui mais comment revenir à l’état initial, si le joueur s’est upgradé ? Le crypter me semble une bonne idée

@romantik par en ligne je parlais du style de jeux multijoueurs, ou clash royal etc.. ces types de jeux communiquent avec le serveur soit pour le multijoueurs soit synchronisé en temps réel les données. Pour ce type de jeux, et c’était une seconde partie de ma question comment c’était fait ?

NRG

Le client n’a absolument pas accès aux données dans ces jeux. C’est le serveur qui les sauvegarde, les charge, et contrôle la progression du joueur. Par exemple, lorsque le joueur gagne de l’argent, ce n’est pas le client qui déclare "J’ai 100000 balles", c’est le serveur qui informe le client qu’il dispose en fait de 500 balles.

romantik

Je ne suis pas sur d’avoir compris ce que tu dis. Le joueur joue, son jeu dit au serveur il a gagné 100 gold, le serveur l’enregistre, à la prochaine partie, le jeu demande (entre autre chose), combien de gold, le serveur lui répond 100.

En tous cas, dans cette état figure, on utilise du sql ? ou une base de donnée JSON avec les donnée de TOUS les joueurs ?

Mais godot à sa mehtode en binaire je pense que ça devrait convenir, non ?

NRG

si, dans le cas où tu es dans un framework comme un moteur de jeu, c’est plutôt le framework qui gère l’architecture logicielle et ses méthodes doivent donc être approprié

Oui mais comment revenir à l’état initial, si le joueur s’est upgradé ? Le crypter me semble une bonne idée

NRG

pas sûr de comprendre, tu veux dire comment récupérer la sauvegarde une fois qu’elle a été modifiée ? En effet, une fois corrompu, elle est perdue. Mais avec une sauvegarde chiffrée aussi. il faut un autre mécanisme pour pouvoir faire de la récupération, mais est-ce bien nécessaire ?

Je ne suis pas sur d’avoir compris ce que tu dis. Le joueur joue, son jeu dit au serveur il a gagné 100 gold, le serveur l’enregistre, à la prochaine partie, le jeu demande (entre autre chose), combien de gold, le serveur lui répond 100.

NRG

le joueur joue, il dit ai serveur qu’il frappe le loup, le serveur calcule qu’il est en mesure de taper le loup, calcule que le loup prend des dommages et meurt, calcule l’ajout d’xp et de gold à donner au joueur, mets à jour les données et communique le tout au joueur. le joueurs se retrouve avec plus de gold sans jamais l’avoir calculé. Bon en vérité parfois il le calcule aussi, souvent dans les jeux très réactifs comme CS ou rocket league. le client fait une prédiction pour pouvoir afficher très vite quelque chose au joueur, mais il se corrige dès qu’il reçoit les vrais données du serveur, créant parfois des roll back pour le joueur.

En tous cas, dans cette état figure, on utilise du sql ? ou une base de donnée JSON avec les donnée de TOUS les joueurs ?

NRG

oui la base de donnée comporte les données de tous les joueurs. Quant à la techno là encore il n’y a pas de réponse universelle. mais sur des jeux comme clash royale ou hearstone c’est probablement des sgbd sql oui

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte