2012-03-17 145 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

相關問題