Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre régulier
    comment sauvegarder au format binaire les pièces de score et items acquises à chaque chekpoint
    Bonjour à tous,

    Je développe un jeu de plateforme où il y a par exemple des milliers de pièces de score à collecter et des milliers d'objets et items à collecter.

    S'il vous plaît, Comment sérialiser et sauvegarder au format binaire, les derniers pièces de score et objets acquis au dernier chekpoint (ou entre les deux derniers chekpoints) , en ignorant de réenregistrer ceux déjà enregistrés auparavant car sinon la sauvegarde et chargement deviennent trop long (il faut à chaque fois enregistrer juste le nécessaire nécessaire), pour éviter qu' ils ne se réinitialisent et pour éviter qu'ils réapparaissent la prochaine fois que le jeu est chargé car ils sont déjà acquis et sauvegardés, merci beaucoup et bonne journée.

    Cordialement.

    (hélas , Je suis complètement bloqué dans le projet à cause de ce problème ...par ailleurs , si mon topic est incompréhensible ou mal formulé , merci de me le dire , car je trouve assez de mal dans la rédaction mais je vais faire max d'effort pour m'améliorer, merci et bonne journée ) .

    Mohamed Trigui.

  2. #2
    Membre expérimenté
    Bonjour,

    Cela dépends beaucoup de la structure de tes niveaux et de ton jeu, il nous faudrait un poil plus d'infos peut-être. Mais en gros dès que tu collectes une pièce / item, celui-ci est enregistré dans une liste, liste qui sera enregistré à chaque checkpoint passé et qui sera recharger à chaque mort du joueur(si j'ai bien compris).

    Typiquement il te faudrait quelque chose pour distinguer les différents items. Si jamais rien ne se superpose dans ton jeu, tu peux très bien utiliser la position de chaque truc comme une sorte d'index. Tu pourrais aussi écrire une fonction qui en définit un pour chaque objet de type pièces / items si jamais utiliser la position n'est pas possible.

    Ainsi à chaque chargement d'un checkpoint ou d'un niveau, a partir de ta liste, tu enlèves chaque items qui à déjà été collecté.

    Pour finir, comme je disais, il nous manque quelques informations.

    Est-il possible de revenir dans un niveau déjà fini ? Dans ce cas il faudra un fichier/liste par niveau.
    Un item/pièce peuvent-ils avoir la même position ? Dans ce cas il faudra utiliser un ID pour chacun.

    J'espère avoir bien compris ton problème, n'hésite pas à me le dire.
    Keep calm and debug it

  3. #3
    Membre régulier
    Bonjour PixelJuice ,

    Tout d'abord , merci infiniment pour ton aide très précieuse et désolé infiniment pour ma réponse tardive .

    En fait , le jeu est un metroidvania plateformer , ça veut dire composé d'un seul très grand niveau ou il faut progresser et gagner progressivement des pouvoirs jusqu’à atteindre la fin du niveau/jeu (un peu comme ori ou you have to win the game ou vvvvvv)avec des chekpoints de sauvegardes automatiques éparpillés partout ,
    à chaque échec , je recharge le niveau soit du début si aucune sauvegarde déjà faite ou depuis le dernier points chekpoint ou j'ai sauvegardé .

    je distingue tout les objets , items par leurs noms (pièce de score1,pièces de score 2 etc) et ensuite par leurs tags ou layers .(ils ont tous un nom unique différent pour chacun d'eux).

    En effet la liste me semble la solution idéale pour cela , mais mon seul dernier problème restant et actuel c'est que j'ai impression que si je sauvegarde que les derniers items acquis au derniers points de sauvegarde , les précédant se réinitialise à 0 ou dans mon cas avec string vide par défaut.

    c'est un ancien problème que j'ai rencontré dans mon précédant metroid vania escape the wormhole ,

    si je ne sauvegarde pas à chaque fois explicitement (avec affectation explicite même au variable déja sauvegardé)tout les paramètres déjà sauvegardés ou non (ça veut dire la totalité à chaque fois), ceux qui n'ont pas été sauvegardés et affectés explicitement se réinitialise à 0 (mais j'utilisai une autre méthode de sauvegarde chargement) ,

    en fait je ne rechargeai pas complètement le niveau , le niveau restait tel qu'il ait en rechargeant seulement avec la fonction load tout les paramètres nécessaires contrairement à maintenant , peut être à cause de cette méthode peut être erroné d'ou vient le probléme de réinitialisation n'est ce pas ???

    j'ai aussi demandé au forum unity answer comment ignorer de sérialiser certains paramètres déjà sauvegardé ils m'ont conseillés d'utiliser d'ajouter non serialised à ceux que je ne veux pas sérialiser , avec système d’héritage mais je ne sais pas honnêtement comment l'utiliser , est ce qu'il faut réellement procéder ainsi ??? (avis au modérateurs , puis je svp ajouter le lien de ma question sur unity answer sur ce topic , merci ).

    Merci encore une fois , désolé pour le dérangement et à bientôt .

    Cordialement.

  4. #4
    Rédacteur/Modérateur

    C'est parce que tu raisonnes mal.
    Un fichier de sauvegarde ce n'est pas un objet magique.
    Si tu écris dans un fichier word, et ne sauvegardes que le dernier paragraphe à chaque fois, que crois-tu retrouver dans ton fichier ? Le texte entier ? Non, tu auras uniquement le dernier paragraphe.
    Il faut tout sauvegarder, à chaque fois. On s'en moque qu'il vienne d'être récupéré ou le soit depuis 10j.
    Quel est l'intérêt de ne sauvegarder que ceux qui ont changé d'état depuis la dernière partie ?
    Comment espères-tu pouvoir récupérer l'état d'un truc qui n'est pas sauvegardé ?
    Les éléments dans leur état par défaut n'ont pas besoin d'être inclus dans une sauvegarde, puisque tu peux les charger avec les données du jeu. Le reste doit l'être obligatoirement.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre expérimenté
    Si dans ce cas là c'est un Metroid-vania, tu te casses la tête pour rien.

    • Un fichier par room (tu pourrais en faire qu'un seul mais autant partir là dessus pour l'instant)
    • Dès que tu collecte un item, tu l'inscris dans la liste en utilisant quelque chose pour l'identifier plus tard.
    • Quand tu quittes une room, tu sauvegardes la liste dans le fichier.
    • Quand tu arrives dans une autre room, tu charges le fichier et lis la liste et tu enlèves tout les items présent dedans, en faisant la concordance avec ce que tu auras utilisé comme ID (nom, position, etc ...).


    Tu pourrais même simplifier ce système en ajoutant une liste de GameObject à ton script qui représente une Room, référençant chaque item dans l'Inspector dans celle-ci, comme ça pas besoin de nommer quoi que ce soit, et tu utiliserais l'index de l'item comme identificateur. Et bien sûr tu sauvegardes / charges à chaque changement de room.

    En tout cas c'est comme ça que je ferais, il y a peut-être un système encore plus simple / opti mais je pense que c'est une bonne base pour commencer.
    Keep calm and debug it

  6. #6
    Membre régulier
    Citation Envoyé par Bousk Voir le message
    C'est parce que tu raisonnes mal.
    Un fichier de sauvegarde ce n'est pas un objet magique.
    Si tu écris dans un fichier word, et ne sauvegardes que le dernier paragraphe à chaque fois, que crois-tu retrouver dans ton fichier ? Le texte entier ? Non, tu auras uniquement le dernier paragraphe.
    Il faut tout sauvegarder, à chaque fois. On s'en moque qu'il vienne d'être récupéré ou le soit depuis 10j.
    Quel est l'intérêt de ne sauvegarder que ceux qui ont changé d'état depuis la dernière partie ?
    Comment espères-tu pouvoir récupérer l'état d'un truc qui n'est pas sauvegardé ?
    Les éléments dans leur état par défaut n'ont pas besoin d'être inclus dans une sauvegarde, puisque tu peux les charger avec les données du jeu. Le reste doit l'être obligatoirement.

    Bonjour Bousk ,

    merci infiniment pour cette information très utile .

    Mais le problème , enfin si je ne me trompe pas de cette situation ci dessous :

    au premier chekpoint , la sauvegarde chargement se fait en un clin d’œil surtout qu'il y'a très peu de choses à sauvegarder , mais au fur et à mesure de la progression par exemple dans les derniers chekpoints ou il faut sauvegarder par exemple une liste entière ou des variables de plusieurs centaines de valeurs voir de milliers de valeurs la sauvegarde et recharge de niveau prend une éternité , en fait c'est ce que j'ai rencontré dans mon précédant metroid vania "escape the wormhole" dés le début j'enregistre tout les variables à enregistrer plusieurs centaines de variables au total voir plus (une erreur oui je sais :,) ) la sauvegarde et recharge de niveau prend tellement de temps comme si c'était une éternité , c'est pour cela que je souhaite sauvegarder cette fois ci que la "mis a jour" de la sauvegarde précédente ,(j'explique mal oui je sais aussi ).

    en tout cas merci infiniment et bonne journée et à bientôt .

    Cordialement .

  7. #7
    Membre régulier
    Citation Envoyé par PixelJuice Voir le message
    Si dans ce cas là c'est un Metroid-vania, tu te casses la tête pour rien.

    • Un fichier par room (tu pourrais en faire qu'un seul mais autant partir là dessus pour l'instant)
    • Dès que tu collecte un item, tu l'inscris dans la liste en utilisant quelque chose pour l'identifier plus tard.
    • Quand tu quittes une room, tu sauvegardes la liste dans le fichier.
    • Quand tu arrives dans une autre room, tu charges le fichier et lis la liste et tu enlèves tout les items présent dedans, en faisant la concordance avec ce que tu auras utilisé comme ID (nom, position, etc ...).


    Tu pourrais même simplifier ce système en ajoutant une liste de GameObject à ton script qui représente une Room, référençant chaque item dans l'Inspector dans celle-ci, comme ça pas besoin de nommer quoi que ce soit, et tu utiliserais l'index de l'item comme identificateur. Et bien sûr tu sauvegardes / charges à chaque changement de room.

    En tout cas c'est comme ça que je ferais, il y a peut-être un système encore plus simple / opti mais je pense que c'est une bonne base pour commencer.
    Bonjour PixelJuice ,

    Merci infiniment encore une fois , mais je n'ai pas bien compris le système de "room" (est ce l'équivalent d'une partie du level design par exemple dans un level design procédurale ?).

    Par défaut je compte faire ceci , je ne sauvegarde pas lorsque je quitte le jeu ,je ne sauvegarde qu'au contact d'un chekpoint (sauvegarde automatique) , et je recharge à chaque nouveau échec (un metroid vania une sorte de die and retry )avec le scéne.load (si je me souviens bien) et avec la fonction load du systéme de sauvegarde si j'ai déjà sauvegardé au moins une fois (ça veut dire depuis le dernier chekpoint) ou par défaut scene.load seulement depuis le tout début si aucune sauvegarde faite.qu'en penses tu de cette solution ?

    et en cas de gameover ,je delete la seule sauvegarde possible et hop obligé de recommencer depuis le début .

  8. #8
    Expert éminent
    au premier chekpoint , la sauvegarde chargement se fait en un clin d’œil surtout qu'il y'a très peu de choses à sauvegarder , mais au fur et à mesure de la progression par exemple dans les derniers chekpoints ou il faut sauvegarder par exemple une liste entière ou des variables de plusieurs centaines de valeurs voir de milliers de valeurs la sauvegarde et recharge de niveau prend une éternité , en fait c'est ce que j'ai rencontré dans mon précédant metroid vania "escape the wormhole" dés le début j'enregistre tout les variables à enregistrer plusieurs centaines de variables au total voir plus (une erreur oui je sais :,) ) la sauvegarde et recharge de niveau prend tellement de temps comme si c'était une éternité , c'est pour cela que je souhaite sauvegarder cette fois ci que la "mis a jour" de la sauvegarde précédente ,(j'explique mal oui je sais aussi ).
    Mauvaise strategie , si le pire cas arrive (donc sauvegarder de grande données) parce qu'on à explorer toute la map , alors il faut optimiser sur ce point là !
    Il faut toujours optimiser on considérant que le pire cas arrive.

    Le second point , c'est comment ça peut être long ,tu enregistre quoi des centaines de Mo ?
    Je pense que si c'est le cas, tu dois revoir ta façon de stocker tes données et/ou de la façon de comment tu les traite.
    Même 100mo ça peut être rapide si on fait DD-> RAM (une simple copie) , et puis ensuite un traitement en RAM + une structure simple.

    dés le début j'enregistre tout les variables à enregistrer plusieurs centaines de variables au total voir plus (une erreur oui je sais :,) )
    Ben non c'est pas une erreur, une centaine de variable ça doit faire quoi moins de 1 ko :p
    Et le premier metroid sur SNES enregistrer bien plus que 100 variables (et ça tourne sur SNES donc bon ^^ )

  9. #9
    Membre régulier
    Citation Envoyé par Kannagi Voir le message
    Mauvaise strategie , si le pire cas arrive (donc sauvegarder de grande données) parce qu'on à explorer toute la map , alors il faut optimiser sur ce point là !
    Il faut toujours optimiser on considérant que le pire cas arrive.

    Le second point , c'est comment ça peut être long ,tu enregistre quoi des centaines de Mo ?
    Je pense que si c'est le cas, tu dois revoir ta façon de stocker tes données et/ou de la façon de comment tu les traite.
    Même 100mo ça peut être rapide si on fait DD-> RAM (une simple copie) , et puis ensuite un traitement en RAM + une structure simple.


    Ben non c'est pas une erreur, une centaine de variable ça doit faire quoi moins de 1 ko :p
    Et le premier metroid sur SNES enregistrer bien plus que 100 variables (et ça tourne sur SNES donc bon ^^ )
    Bonjour Kannagi ,

    tu as probablement raison .

    En fait et si je ne me trompe pas , le fichier binaire de sauvegarde d"escape the wormhole" est entre 3ko et 6ko à peut prêt , mais à chaque échec et recharge partie ça mettait bizarrement énormément de temps .

    Je penses avoir compris finalement le problème ,si je me souviens bien , je save and load aussi à chaque échec (je ne me souviens plus pourquoi) du coup à cause probablement de ce mélange immédiat et double de sauvegarde chargement ça mettait autant de temps alors qu'il fallait apparemment sauvegarder et recharger séparément ça veut dire pas en même temps , n'est ce pas ???

    Sinon ,quels sont les méthodes les plus connus pour optimiser au maximum la sauvegarde chargement ?

    En tout cas merci pour cet éclaircissement et bonne journée .

    (Nb : apparemment , je disais n'importe quoi précédemment à propos du système de room mais j'ai compris probablement le principe ...merci ^^)

    Cordialement .

  10. #10
    Rédacteur/Modérateur

    Citation Envoyé par Bioshok Voir le message
    plusieurs centaines de valeurs voir de milliers de valeurs la sauvegarde et recharge de niveau prend une éternité [...] enregistrer plusieurs centaines de variables au total voir plus
    Tu as clairement un problème dans ta sauvegarde. Faut pas se voiler la face et corriger ce problème. T'améliores pas la tenue de route d'une voiture aux pneus crevés en modifiant les ceintures de sécurité.
    Le plus mauvais des disques durs charge un fichier aussi petit en un clin d'oeil.
    Une fois en RAM, ça importe peu. S'agit de pas faire absolument n'importe quoi avec sa structure de données et leur utilisation.
    Même avec tous les cache-miss du monde, charger un milliers de variables devrait être de l'ordre de l'anecdotique.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Membre régulier
    Bonjour Bousk ,merci .

    Petite rectification : pardon , la taille du fichier de sauvegarde de mon précédant metroidvania "Escape the wormhole" et après vérification est entre 30ko à 50ko.

    ...Bon , tout est bien sur relatif pour chacun de nous , pour moi l'échec puis la recharge du niveau dans "escape the wormhole" prend nettement du temps , peut être que ce n'est pas le cas pour d'autres personnes ...

    sinon , une autre question , vector3 et vector2 ne sont t'ils pas des types sérializables ??? (c'est en tout cas l'erreurs que m'a affiché le debugger )

  12. #12
    Membre régulier
    après réflexion ,ça y est , j'ai compris le mal fonctionnement

    ma méthode de sauvegarde chargement est correcte , le problème ne vient pas de la , mais de la méthode de level design et d'implémentation ci dessous :

    -En fait je n'utilise pas de système de parties connectés ou "room" comme m'a suggéré PixelJuice ,
    je charge la map du jeu en une seule fois à chaque fois (que ce soit au début ou à chaque recharge niveau) totalement dans la méthode start puis je désactive active les gameobjects à volonté au fur et à mesure de leurs distances du joueur un peu comme gta au début :

    par exemple , si le gameobject s'éloigne du joueur d'une certaine distance il se désactive au contraire lorsqu'il se rapproche il se réactive (avec un simple if else permanente dans la méthode update ) .

    et comme c'est un metroid vania , ça veut dire un semblant de grand oppen world 2d avec un nombre incalculable de Gameobject ou tout doit être activé au début puis activé /désactivé avec la méthode update selon la distance dans mon cas , le chargement du niveau à lui seul prend énormément du temps ,qu'en pensez vous de la solution d'ont destroy du niveau existant sans utiliser scéne.load avec seulement load du nécessaire , ou autre solution, comment faire en sorte de charger avec start uniquement et que les gameobjects initiaux proches du joueur sans calcul du reste ??? (un simple if else suffira elle dans start à part update ???? ).

    Merci infiniment et bonne journée .

    Cordialement .

  13. #13
    Membre régulier
    Ou , il faut désactiver par défaut tout les gameobjects du jeu dans l'inspector de l'éditeur après la finalisation du level design avant de lancer le jeu , pour qu'il n'active par défaut que le juste nécessaire ???? (ils sont tous activés par défaut dans l'inspector et au lancement du jeu ...)

###raw>template_hook.ano_emploi###