2012-03-17 15 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() का उपयोग करने का सुझाव देता है। यह इंगित करेगा कि अगर पृष्ठभूमि में ओएस द्वारा प्रोग्राम को स्मृति से बाहर निकाला जाता है, तो सब कुछ खो जाएगा। ऐसा लगता है कि अधिकांश (मैंने परीक्षण किया) गेम क्या करते हैं: यदि आप खेलते समय घर पर आते हैं तो वापस जाएं, स्तर फिर से शुरू हो जाता है। यदि आप घर पर आते हैं, तो बहुत सी चीजें खोलें (एंड्रॉइड को स्मृति से गेम को हटाने के लिए पर्याप्त), फिर वापस जाएं, कुछ भी शुरू नहीं हुआ है, गेम मुख्य मेनू से शुरू होता है। क्या इसका मतलब यह है कि वे यही उपयोग करते हैं, और यदि हां, तो क्या यह एक अच्छा अभ्यास है?

ध्यान दें कि Bundle की दृढ़ता के बारे में प्रश्न केवल एक माध्यमिक जिज्ञासा है। मुझे वास्तव में परवाह नहीं है कि इस खेल की स्थिति स्थायी रूप से सहेजी नहीं जाती है और कुछ समय के लिए पृष्ठभूमि में होने के बाद खो जा सकती है (जैसा ऊपर 2 में वर्णित है)। मुझे इस मामले के लिए सबसे अच्छा अभ्यास में दिलचस्पी है।

+1

बस एक छोटा सा नोट: बिटमैप पार्ससेल योग्य लागू करता है। (Http://developer.android.com/reference/android/graphics/Bitmap.html)। मुझे लगता है कि आपके समाधान # 1 को लागू करने का सबसे अच्छा/सुरक्षित तरीका है। – YuviDroid

+0

@YuviDroid - आह, मुझे याद आया कि, धन्यवाद :)। इसका मतलब है कि मैं इसे कर सकता हूं, लेकिन यह अभी भी 168k प्रतिष्ठा के साथ किसी को छोड़ देता है जिसका अर्थ है कि मुझे इस प्रश्न में नहीं होना चाहिए: http://stackoverflow.com/questions/4285877/which-one-to-use-onsaveinstancestate-vs -onretainnonconfigurationinstance - मैं एक विधि चुनने से पहले या इसके खिलाफ कुछ तर्क सुनना चाहता हूं, क्योंकि मुझे विषय बहुत भ्रमित लगता है। – IVlad

उत्तर

2

मूल विचार यह है कि, आईएमओ, मूल्यों के सबसे छोटे संग्रह की पहचान करता है जो आपको अपने गेम की स्थिति को फिर से बनाने में सक्षम बनाता है। उन साझा प्राथमिकताओं में सहेजें।

+2

साझा प्राथमिकता निश्चित रूप से लगातार होती है और मैं जो काम कह रहा हूं वह प्राप्त कर सकता हूं। हालांकि, यह मेरी राय में बहुत गन्दा होगा: मेरे पास राज्य, वर्तमान फ्रेम, स्थिति, गति इत्यादि के बारे में जानकारी के साथ वस्तुओं की सूचियां हैं। इसे बचाने के लिए बहुत कुछ होगा और लोड करने के लिए बहुत कुछ होगा, और यदि मैंने कभी भी जोड़ने का फैसला किया है एक नया ऑब्जेक्ट प्रकार, इसे जोड़ने के लिए बहुत सारे काम। यह 'पार्सेलबल' को लागू करने से भी अधिक काम करेगा, क्योंकि साझा वरीयताएं आपको पार्ससेलबल्स को सहेजने की अनुमति नहीं देती हैं। अगर मैं स्तर की स्थिति लगातार रहना चाहता हूं तो शायद इसकी मदद नहीं की जा सकती है, लेकिन मुझे इस खेल के लिए वास्तव में परवाह नहीं है। – IVlad

संबंधित मुद्दे