2016-09-04 46 views
0

我目前正在为Android设备开发RPG游戏,并刚刚实施了一种用于保存玩家进度的自定义序列化方法。保存过程可能需要半秒钟的时间,这足以发生崩溃(由设备(即低电池电源关闭),用户(杀死应用程序)或写得不好的固件/ ROM(内核恐慌引起) )等)。当应用程序意外退出时防止数据损坏

保存玩家数据时,旧玩家数据被覆盖。这意味着如果发生崩溃,并且保存过程因此被取消/中断,玩家的数据将会丢失。这显然不是理想的,在未来,游戏将节省更多的数据,节省的时间将会更长。这会增加在保存过程中发生崩溃的可能性。

我无法缩短保存时间,因为我正在编写游戏需要在应用程序重新启动后能够恢复的最小数据。

如果有的话,我可以采取什么样的万无一失措施来防止此类数据损坏/丢失的发生?

+0

为什么不保存临时文件集,并在完成过程中移动/重命名它们,然后删除以前的保存文件? –

+0

@SR_感谢您的回答。这似乎是一个好主意,也是我真正拥有的唯一选择。我可能会实现这样的事情。 – rodit

回答

2

您可以将数据保存在一组临时文件中,并在完成过程时移动/重命名它们,然后删除以前的保存文件。

如果你不自信与重命名过程中,您可以添加这些约束:

  1. 确保数据与校验
  2. 总是试图从最后一致保存的状态恢复,这取决于一致根据你自己的规则(文件名,...)

另一个想法是将你的数据分割成几部分,以便隔离不会改变的状态。 如果节省时间非常长,您可以尝试在游戏过程中使用剩余的CPU时间预先保存当前状态不会改变的部分(例如使用较低优先级的线程)。

+0

感谢你的回答。我可能会实现这样的事情,因为它比使用SQLite数据库更容易。 – rodit

2

您可以将数据保存到SQLiteDatabase。如果更改保存数据失败或中断,数据库将自动回滚到先前已知的状态。

如果您需要以原子方式执行多个更新以获得额外的安全性,请将所有更改置于事务中。如果任何更改失败,则整个事务将回滚到事务前状态。

有关使用SQLite的更多信息,请参见文档here。为了在您希望与其他应用程序共享或将其同步到备份服务器的情况下更轻松地操作保存数据,请考虑通过ContentProvider与您的数据交互。

+0

感谢您的回答。尽管这是一个好主意,我喜欢它回滚的事实,但我不认为SQLite数据库适合于游戏,因为我不想为每个单独的信息创建表和字段。想要存储。 – rodit

+0

了解您不想使用数据库。但是,如果游戏需要存储和检索结构化数据,我认为数据库适合于游戏。数据库中的难点在于决定存储数据的最佳方式,但是我发现设计良好的数据库很难在易用性和可靠性方面打败。 – happydude

+0

我会同意你的看法,但我很懒,我宁愿不改变我刚刚写的我的序列化系统:对于那些需要我几个小时的工作(我是一个人的开发团队......) – rodit

相关问题