Mon jeu enregistre son état après un intervalle fixe sur un fichier dans le stockage interne du jeu / de l'application. Lorsque mon jeu est tué ou bloqué respectivement par l'utilisateur ou le système d'exploitation, nous écrivons l'état actuel du jeu sur ce fichier. L'écriture de fichiers après l'intervalle de correction fonctionne correctement mais lorsque le jeu est bloqué / tué par le système d'exploitation ou l'utilisateur, l'opération d'écriture de fichiers échoue. L'échec de l'opération entraîne un état de jeu incomplet ou un état de jeu vide, c'est-à-dire aucune donnée écrite dans le fichier. J'ai essayé plusieurs solutions en utilisant le service Android, dans le cas où le service est NON STICKY, le service est tué avec l'application. D'un autre côté, si le service est STICKY, il est redémarré mais l'intention qui a été attachée initialement avec le service est nulle ou nouvelle.
La question est de savoir comment puis-je enregistrer mes données (pourrait être ~ 2-3 Mo) complètement sur fichier dans le stockage interne lorsque mon jeu / application est tué par l'utilisateur / OS?
Réponses:
Je suggérerais d'écrire votre état de sauvegarde d'une manière à double tampon, comme cela était courant pour les titres de console dans le passé (où vous deviez faire face à la carte mémoire retirée en cours d'écriture et les écritures étaient lentes).
Sauvegarder:
Charge:
Ce flux fonctionnera pour garantir qu'il y ait toujours au moins une sauvegarde valide dans votre stockage, même si l'application est supprimée en cours d'écriture. Le joueur n'obtiendra aucun des changements dans l'état du jeu depuis la sauvegarde précédente si ce genre d'échec se produit, mais il n'aura pas à recommencer.
De plus, vous devez enregistrer immédiatement après les événements clés (tels que les achats intégrés) en plus de votre enregistrement d'intervalle, pour minimiser la fenêtre de vulnérabilité où un crash / kill entraînerait la perte de cet événement clé. C'est également une protection contre les exploits du jeu (par exemple, tuer l'application de force après avoir perdu une vie, car vous savez que vous reviendrez à un état de jeu avant de perdre une vie, et que vous pourrez réessayer). Bien sûr, si vous effectuez cette opération, vous devez protéger votre sauvegarde par intervalles avec une logique qui dit "si une sauvegarde est déjà en cours, n'essayez pas de recommencer la sauvegarde".
la source
java.nio.file.Files.move(Path source, Path target, CopyOption... options)
peut renommer et écraser comme une opération atomique.sync()
le fichier B avant de le déplacer sur le fichier A (même dans ce cas, il n'y a pas de garanties complètes, maissync()
c'est assez bon).Android ne tue les applications que lorsqu'elles sont en arrière-plan. Vos données de jeu doivent-elles vraiment être mises à jour lorsque l'application est en arrière-plan, ou pouvez-vous arrêter de mettre à jour les données jusqu'à ce que l'application revienne au premier plan? Vous pourrez peut-être différer les mises à jour même dans un jeu multijoueur, si vous pouvez récupérer un historique des événements ou même simplement l'état actuel lorsque l'application revient au premier plan. C'est quelque chose que vous devriez probablement envisager de toute façon pour le processeur, le réseau et l'efficacité de la batterie.
Si l'utilisateur tue votre application, les services en cours d'exécution doivent recevoir un appel à
onTaskRemoved
. Je ne sais pas ce qui se passerait si vous essayiez de faire beaucoup de traitement avec cette méthode. Je m'attends à ce que s'il ne revient pas dans un certain délai, Android utiliserakill -9
votre application.la source