2012-03-31 14 views
6

मैं एंड्रॉइड पर एक गेम विकसित कर रहा हूं। टावर रक्षा की तरह। मैं सतह दृश्य का उपयोग कर रहा हूं। मैं बिटमैप के रूप में कुछ छवि का उपयोग कर रहा हूं। (स्प्राइटशीट्स, टाइल्सेट्स, बटन, पृष्ठभूमि, इफेक्ट बनाम) अब छवियां लगभग 5-6 एमबी हैं। और जब मैं अपना गेम चलाता हूं तो मुझे यह त्रुटि मिलती है:बिटमैप आकार वीएम बजट से अधिक है जब खेल विकास

बिटमैप आकार

19464192-बाइट बाहरी आवंटन इस प्रक्रिया के लिए बहुत बड़ी से अधिक है वीएम बजट।

मुझे लगता है कि

BitmapFactory.decodeResource(res, id) 

तरह छवियों फोन और मैं इसे सरणी के लिए डाल दिया। मैं छवियों को स्केल नहीं कर सकता। मैं उन सभी का उपयोग कर रहा हूं। मैंने कोशिश की है कि

options.inPurgeable=true; 

और यह काम लेकिन छवि बहुत slowly.I लोड के साथ एक spritesheet लोड कर रहा है और जब यह लोड कर रहा है, मैं मिल बहुत बहुत कम एफपीएस।

मैं क्या कर सकता हूं?

उत्तर

0

मैं एक गेम देव नहीं हूं हालांकि मुझे लगता है कि मैं एंड्रॉइड को पर्याप्त जानता हूं।

आकार की छवियों को लोड करना त्रुटियों को फेंकने के लिए लगभग निश्चित है। छवियों का आकार क्यों है?

http://p-xr.com/android-tutorial-how-to-paint-animate-loop-and-remove-a-sprite/ पर एक उदाहरण है। यदि आप देखते हैं कि उसके पास केवल ~ 200 केबी का विस्फोट हुआ है। यहां तक ​​कि एक और विस्तृत छवि भी अधिक फ़ाइल स्थान नहीं लेगी।

ठीक कुछ सुझाव:

  • आप एक ही शीट पर सभी अपने spritesheets लोड हो रहा है या एक अलग फ़ाइल में प्रत्येक spritesheet है कर रहे हैं? यदि वे सभी एक हैं तो मैं उन्हें विभाजित करता हूं।

  • लोअर छवियों का संकल्प, एक Android डिवाइस और कुछ केवल एक कम रिज़ोल्यूशन वाला स्क्रीन है पोर्टेबल है। उदाहरण के लिए एचटीसी वाइल्डफायर में 240x320 (एलडीपीआई डिवाइस) का एक संकल्प है और यह काफी सामान्य डिवाइस है। आपने छवि आयामों को नहीं बताया है, इसलिए हम यह सुनिश्चित नहीं कर सकते कि यह व्यावहारिक है या नहीं।

अंत में; मैं एक गेम प्रोग्रामर नहीं हूं लेकिन मुझे यह ट्यूटोरियल (एक ही श्रृंखला का हिस्सा) काफी प्रबुद्ध - http://p-xr.com/android-tutorial-2d-canvas-graphics/ मिला। मुझे आश्चर्य है कि क्या आप ऐसे पैटर्न को लागू कर रहे हैं जो एंड्रॉइड के लिए उपयुक्त नहीं है, हालांकि कोड के बिना मैं नहीं कह सकता।

सही कुछ थोड़ा दूर विषय लेकिन ध्यान देने योग्य ...

अनुमान के तहत लोगों को देखें की शक्ति। जबकि SurfaceView का उपयोग करने के लिए तर्क की एक निश्चित मात्रा है, मानक दृश्य अपने आप पर बहुत कुछ करेगा। एक सतह दृश्य को अधिक काम करने के लिए एक अंतर्निहित थ्रेड चलाने की आवश्यकता नहीं है (जिसे आपको स्वयं को सेटअप करना होगा)।एक दृश्य हालांकि ड्रॉ() पर कॉल करता है, जिसका उपयोग postinvalidate() विधि सहित विभिन्न तरीकों से किया जा सकता है (What does postInvalidate() do? देखें)।

किसी भी मामले में यह इस ट्यूटोरियल http://mindtherobot.com/blog/272/android-custom-ui-making-a-vintage-thermometer/ को देखने के लायक हो सकता है। निजी तौर पर, यह कस्टम व्यू का एक उत्कृष्ट उदाहरण था और आप उनके साथ क्या कर सकते हैं। मैंने कुछ खंडों को फिर से लिखा और एक जेब घड़ी ऐप बनाया।

+0

मैं आपकी मदद के लिए धन्यवाद देता हूं लेकिन मैं हल नहीं कर सकता। मैं बड़ी spritesheet का उपयोग करता हूं क्योंकि बहुत अधिक एनीमेशन हैं। उदाहरण के लिए, यह मेरे खेल से एक प्राणी की spritesheet है: http://nafiz.in/bigeye.png मैं आकाशगंगा का उपयोग करता हूं और मैं इस स्प्रिंगशीट का पूर्ण आकार उपयोग कर रहा हूं। Firsly मुझे इसे अपने डिवाइस पर काम करना चाहिए। शायद, बिटमैप के लिए 7-8 एमबी सीमा है। मैं फिर से शोध करता हूं और मुझे इस समस्या को हल करने के लिए मिला है कि मुझे jni या opengl का उपयोग करना होगा। लेकिन उस बिंदु पर, मैं उनका उपयोग नहीं कर सकता। शायद अन्य परियोजना। इसलिए मैं हटा दूंगा ढेर प्रबंधन पर कुछ एनीमेशन और काम। –

2

मुझे यह समस्या भी मिली है; आपके द्वारा एक बार लोड किए गए बिटमैप्स की संख्या/आकार को कम करने के अलावा वास्तव में कोई समाधान नहीं है। कुछ पुराने एंड्रॉइड डिवाइस केवल आपके पूरे एप्लिकेशन के लिए ढेर में 16 एमबी आवंटित करते हैं, और बिटकमैप स्मृति में संग्रहीत किए जाने पर असम्पीडित होते हैं, इसलिए बड़ी पृष्ठभूमि के साथ 16 एमबी से अधिक होना मुश्किल नहीं होता है (एक 854x480, 32-बिट बिटमैप के बारे में है 1.6 एमबी असंपीड़ित।)

मेरे खेल में मैं केवल बिटमैप्स लोड करके इसे प्राप्त करने में सक्षम था जिसे मैं वर्तमान स्तर में उपयोग करने जा रहा था (उदाहरण के लिए मेरे पास पृष्ठभूमि के लिए एक बिटमैप ऑब्जेक्ट है जो प्रत्येक से संसाधनों से पुनः लोड हो जाता है स्मृति में कई बिटमैप्स बनाए रखने के बजाए यह समय बदलता है। मैं केवल एक int को बनाए रखता हूं जो ट्रैक करता है कि मैंने वर्तमान में कौन सा संसाधन लोड किया है।)

आपकी स्प्राइट शीट बहुत बड़ी है, इसलिए मुझे लगता है कि आप सही हैं कि आपको अपने एनिमेशन के आकार को कम करें। वैकल्पिक रूप से, संसाधनों से लोड करना तेज़ी से तेज़ होता है, इसलिए आप कुछ ऐसा करने में सक्षम हो सकते हैं जैसे कि चरित्र की वर्तमान दिशा के लिए केवल एनीमेशन पट्टी लोड करना, और जब आप उसे नई एनीमेशन स्ट्रिप के साथ बदलते हैं तो उसे थोड़ा रोक दें। हालांकि यह जटिल हो सकता है।

इसके अलावा, मैं यह सुनिश्चित करने के लिए कि आप सभी उपकरणों के लिए समस्या को ठीक कर चुके हैं, एक वीएम ढेर सेट 16 एमबी के साथ एम्यूलेटर पर अपने ऐप का परीक्षण करने की अत्यधिक अनुशंसा करते हैं। (एम्यूलेटर आमतौर पर 24 एमबी तक चूक जाता है, इसलिए इसके लिए अनचाहे जाने और रिलीज के बाद कुछ 1-सितारा समीक्षाएं उत्पन्न करना आसान होता है।)

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