2012-03-17 117 views
7

我有一个游戏,我在SurfaceView上绘制和移动位图。用户可以交互(拖放)这些位图。当玩家击中主页按钮然后回到游戏中时,我希望能够暂停游戏,然后将其恢复到离开游戏之前的位置。什么是最好的方式来存储我的自定义对象?我应该在哪里存储我的游戏关卡状态?

  1. 我应该实现onSaveInstanceState(Bundle),并拥有所有我要救实现Parcelable接口,其对象的类的?这将是相当多的工作,我仍然不确定我将如何保存像位图这样的东西。我想我不会,我只是从磁盘重新加载。

    我也对捆绑软件提供的存储类型感到困惑:除非您自己清除它,否则永远不会消失的磁盘存储,或者如果操作系统决定在内存中删除程序时从内存中消失的内存存储。根据this question中的意见,它是磁盘存储。 documentation意味着它是内存存储,说Note that it is important to save persistent data in onPause(),但我不觉得它非常清楚。 This page也意味着它不是持久的:只要应用程序保留在内存中,它就会持续。那么是哪一个呢?

  2. 上面的最后一个链接建议使用onRetainNonConfigurationInstance()在应用程序处于后台时将对象保留在内存中。这意味着如果程序在后台被操作系统从内存中取出时,一切都会丢失。这似乎是大多数(所有我测试过的)游戏所做的:如果您在玩游戏时打回家,然后再回去,关卡会恢复。如果你打回家,打开很多东西(足以让Android从内存中移除游戏),然后重新开始,没有任何东西被恢复,游戏从主菜单开始。这是否意味着这是他们使用的,如果是这样,这是一种好的做法吗?

请注意,有关Bundle的持续性问题只是次要的好奇心。我并不在乎这款游戏的状态是否没有永久保存,并且在游戏进行一段时间后会丢失(如上面的2所述)。我对这种情况的最佳做法感兴趣。

+1

只是一个小提示:位图实现Parcelable。 (http://developer.android.com/reference/android/graphics/Bitmap.html)。我认为最好/最安全的方法是实施你的解决方案#1。 – YuviDroid 2012-03-17 22:36:58

+0

@YuviDroid - 啊,我确实想念,谢谢:)。这意味着我可以做到这一点,但它仍然留下了一个有168k声望的人暗示我不应该在我链接到的问题中:http://stackoverflow.com/questions/4285877/which-one-to-use-onsaveinstancestate-vs -onretainnonconfigurationinstance - 我想在选择一个方法之前听到一些赞成或反对的论点,因为我觉得这个主题很混乱。 – IVlad 2012-03-17 22:48:18

回答

2

基本的想法是,IMO确定能够让您重新创建游戏状态的最小值集合。将这些保存在共享偏好中。

+2

共享喜好绝对是持久的,我可以得到你说的工作。然而,在我看来,这会非常混乱:我有对象列表,包括关于状态,当前帧,位置,速度等的信息。要保存并加载很多内容,并且如果我决定添加一个新的对象类型,添加它的很多工作。这比实现'Parcelable'还要做更多的工作,因为共享首选项不允许保存可接受的部分。如果我想让关卡状态保持不变,这可能无法帮助,但我并不真正关心这个游戏。 – IVlad 2012-03-17 22:28:54

相关问题