डिस्क पर न्यूनतम से फ्रेम एनीमेशन द्वारा गेम फ़्रेम को कैसे संपीड़ित करें


19

मैं एज ऑफ एम्पायर (नक्शे पर इमारतें) की तरह एक खेल विकसित कर रहा हूं और हर इमारत के लिए मेरे पास इसकी एनीमेशन के लिए एक स्प्राइट शीट है। मैं फ्रेम एनीमेशन द्वारा फ्रेम का उपयोग कर रहा हूँ इमारत को चेतन करने के लिए (किसी भी अन्य विधि वैसे भी पता नहीं)। मैं देख रहा हूँ कि मेरे संसाधनों का फ़ोल्डर बहुत बड़ी छवियों के कारण जा रहा है जो मैं इसमें डाल रहा हूँ।

CoC और Age of Empires जैसे गेम अपने apk का आकार 50 Mg से कम कैसे रखते हैं? जब मैं खेल के विकास की बात करता हूँ तो मुझे यहाँ कुछ याद आता है

धन्यवाद

संपादित करें: समस्या का अधिक जानकारी मैं सामना कर रहा हूँ

मेरे पास बहुत सारी एनिमेशन ऑब्जेक्ट्स हैं। मैंने इस तरह से चुना क्योंकि यह सबसे तेज था और यह उन परिणामों की पैदावार कर रहा था जो मुझे चाहिए। मूल रूप से हर इमारत एक एनीमेशन ड्रॉबल है जिसमें इसकी xml फ़ाइल 8 ड्रॉअबल्स (8 चित्र = 8 फाइलें) को संदर्भित करती है। ये सभी पारदर्शिता के कारण पीएनजी हैं। चूंकि मेरे पास 200 से अधिक छवियां हैं, इसलिए एपीके का आकार 120 एमबी है (और मैं अभी तक आधे फाइलों की नकल नहीं कर रहा हूं)। यही संकेत है, इसे हल करने का एक तरीका होना चाहिए। कृपया एक साथी डेवलपर की सहायता करें


छवियों को संपीड़ित करना या गेम सामग्री को एपीके से अलग करना, वह हो सकता है जिसे आप ढूंढ रहे हैं।
जानोस टुरन्ज़स्की

आप विस्तार फ़ाइलों का मतलब है? विस्तार फ़ाइलों की समस्या अलग घनत्व ड्रॉ करने योग्य फ़ोल्डर नहीं है। क्या यह खेल है? मैं फ्रेम एनीमेशन (पूर्ण निर्माण छवि) द्वारा फ्रेम कर रहा हूं। या मैं पूरी तरह से गलत रास्ते पर हूँ
नाग

बस मामले में, मैंने मदद करने की कोशिश की और आपकी छवियों के लिए स्थान बचाने से संबंधित उत्तर दिया। हालांकि, आपका सवाल भ्रामक है: यह स्पष्ट नहीं है कि क्या आप वास्तव में "जैसे सीओसी और एज ऑफ एम्पायर जैसे खेल कैसे करते हैं?" या यदि आप बस जाँचना चाहते हैं कि क्या कम डिस्क-स्थान भूख के तरीके से एनिमेट कर रहे हैं (जैसे कि आपका शीर्षक बताता है)। कृपया स्पष्ट करें, इसलिए मैं अपना उत्तर हटा सकता हूं यदि यह मामला है और इसलिए भी आप अधिक सटीक उत्तर प्राप्त कर सकते हैं।
MAnd

@ और मैंने अपने उत्तर को आगे की समस्या को प्रतिबिंबित करने के लिए संपादित किया
स्नेक

2
आयु की साम्राज्ञी के लिए, यह शायद कम रिज़ॉल्यूशन का एक संयोजन है (IIRC इसे 640x480 के लिए डिज़ाइन किया गया था) और अनुक्रमित छवियां (पूर्ण आरजीबी नहीं)।
user253751

जवाबों:


24

यह आपके प्रश्न से स्पष्ट नहीं है यदि आप वास्तव में ऐसी तकनीकों को जानना चाहते हैं जो भारी मात्रा में भारी छवि / संसाधन फ़ाइलों के होने पर भी डिस्क स्थान को बचाने की अनुमति देती हैं (यह प्रश्न के शरीर में क्या है), या यदि आप बस जानना चाहते हैं आपकी इमारतों के लिए एनीमेशन करने के कम-डिस्क भूखे तरीके हैं (यह वही है जो आपके प्रश्न के शीर्षक से निहित है)।

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


कहा कि, एक समान स्थिति में, डिस्क में अंतरिक्ष को बचाने के संदर्भ में मैंने जो दो समाधान देखे (और एक बार उपयोग किए गए) थे:

1) एक ही छवि के भीतर व्यक्तिगत छवियों को समेटने के लिए। कभी-कभी यह मदद का हो सकता है। इसलिए, निम्न रंगीन वर्गों में से प्रत्येक के लिए 4 अलग-अलग फ़ाइलों को सहेजने के बजाय, मैं उनमें से सभी को एक साथ एक ही छवि के भीतर सहेजता हूं (और केवल गेम कोड के माध्यम से उन्हें विभाजित कर दूंगा):

यहाँ छवि विवरण दर्ज करें

इस उदाहरण में, प्रत्येक को 4 अलग-अलग PNG फ़ाइलों में 1255 बाइट्स में सहेजा जा रहा है, जबकि सभी समाप्‍त वाली एकल फ़ाइल 451 बाइट्स है। बेशक, यह कितना मदद कर सकता है यह मामला-दर-मामला आधार पर निर्भर करता है और आपको यह देखने के लिए परीक्षण करना चाहिए कि क्या यह आपकी छवियों के आधार पर आपकी मदद कर सकता है।

2) संसाधन फ़ोल्डर को संपीड़ित करने के लिए। डिस्क स्थान को बचाने के लिए यह अक्सर बहुत सहायक हो सकता है। फिर जब गेम आपको चला रहा होता है तो या तो डीकंप्रेस होता है या कम्प्रेस्ड फाइल से वांछित इमेज को खींचता है - आपके द्वारा उपयोग किए जाने वाले कंप्रेशन फॉर्मेट के आधार पर। इसका पिछला उत्तर देखें जो इस साइट का विकि बन गया है: /gamedev//a/37649/72423

लेकिन यह भी ध्यान रखें कि आपके द्वारा उपयोग की जाने वाली छवि फ़ाइल प्रकार के आधार पर प्रत्येक प्रकार का संपीड़न अधिक या कम लाभप्रद हो सकता है : संसाधनों के दोहरे संपीड़न से बचें

संपीड़न पर अधिक जानकारी के लिए: छवि संपीड़न में कला की स्थिति?


अंत में, आप यह भी सोच सकते हैं कि प्रत्येक स्थिति के लिए किस प्रकार की छवि का उपयोग करना है: कौन सा छवि प्रारूप अधिक स्मृति-कुशल है: पीएनजी, जेपीईजी, या जीआईएफ?


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

@ इसलिए, आपके द्वारा किए गए संपादन के अनुसार, मुझे लगता है कि मेरा उत्तर वास्तव में मददगार हो सकता है। कॉन्टेक्टेटिंग इमेजेस + कंप्रेसिंग आपके फोल्डर का साइज एक बड़ी रकम से कम कर सकती है। दोनों तकनीकों का नियमित रूप से कुछ प्रकार के खेलों में उपयोग किया जाता है। संघ के बारे में, यह हमेशा एक आश्चर्यजनक चाल है। इसे स्वयं आज़माएँ: छवियों को एक-एक एनीमेशन के अनुक्रम से साइड-बाय-साइड में रखें और अंतिम आकार की तुलना व्यक्तिगत छवियों के योग से करें। तब आप देख सकते हैं कि क्या आपके मामले में मदद करता है। संपीड़न के लिए, पीएनजी के लिए यह कम प्रभावी हो जाता है, लेकिन फिर भी आपके अंतिम फ़ोल्डर के आकार में कटौती के प्रयास के लायक है
MAnd

@ कोई भी अवलोकन करें, हालाँकि: कभी-कभी समाप्‍त करने लायक नहीं होता है या अंतिम आकार को थोड़ा बढ़ा देता है। लेकिन अक्सर यह वांछनीय कटौती प्रदान कर सकता है। यह सब आपकी छवियों पर निर्भर करता है
21

मुझे याद है कि दोनों तकनीक की कोशिश कर रहे थे और कमी 10% से कम थी। मुझे निश्चित रूप से पता है कि पीएनजी के साथ कंप्रेशन कोई मायने नहीं रखता है लेकिन मैं कंसट्रक्शन की कोशिश करूंगा। इसलिए मैंने पूछा कि अन्य खेल कैसे करते हैं क्योंकि जाहिर है कि उनके पास मेरे मुकाबले अधिक ग्राफिक्स हैं
स्नेक

आपको छवियों से भरे फ़ोल्डर को संपीड़ित करने में सक्षम नहीं होना चाहिए। छवियों को पहले से ही संपीड़ित किया जाना चाहिए, और बहुत अधिक दोहराव वाले अनुक्रम नहीं होने चाहिए। अगर उन्होंने किया, तो संपीड़न की अतिरिक्त परत छवि कोडेक का हिस्सा होगी ...
corsiKa

9

मेरा प्रस्ताव है कि आप TexturePacker का प्रयास करें

  • आप बस अपनी सभी छवियों को ड्रैग और ड्रॉप कर सकते हैं और उन्हें पैक कर सकते हैं
  • आप विभिन्न संपीड़न लागू कर सकते हैं - उदाहरण के लिए अनुक्रमित PNGs का उपयोग करें जो कम मेमोरी का उपभोग करते हैं - एक मानक PNG फ़ाइल की तुलना में 70% तक कम
  • आप एक फ़ाइल डेटा फ़ाइल बना सकते हैं जिसमें आपके प्रत्येक भवन का नाम + स्थिति शामिल है
  • मुक्त संस्करण आपके लिए स्प्राइट शीट बनाने के लिए पहले से ही पर्याप्त हो सकता है

क्या आप एंडग्विन, कोकोस 2 डी-एक्स या लिबीडीएक्स जैसे गेम डेवलपमेंट फ्रेमवर्क का उपयोग करते हैं? => कोई नहीं

क्या आपको एक ही समय में अपनी सभी छवियों को लोड करने की आवश्यकता है? ऐसा लगता है कि आप लक्ष्य उपकरणों पर भारी रैम समस्याओं में भाग लेंगे।


अद्यतन: साँप ने मुझे कुछ चित्र भेजे। जैसा कि वादा किया गया है कि उन्हें यहां सार्वजनिक नहीं किया जाएगा, इसलिए मैंने खुद को उपयोग करने के लिए कुछ कला बनाई है कि स्मृति का उपयोग कैसे कम किया जाए।

मूल छवि में, छवि का केवल एक हिस्सा घूम रहा था। मैंने इसे प्रदर्शित करने के लिए एक पक्षी को घर पर रखा है:

यहाँ छवि विवरण दर्ज करें

मूल रूप से पूर्ण एनीमेशन को एक शीट में पैक करना स्मृति का एक बड़ा अपशिष्ट है। आपको स्थैतिक और गतिशील भागों को विभाजित करना चाहिए:

स्थैतिक:

यहाँ छवि विवरण दर्ज करें

Anim01:

यहाँ छवि विवरण दर्ज करें

Anim02:

यहाँ छवि विवरण दर्ज करें

छवियों में पक्षी की मूल स्थिति रखें । यही कारण है कि ऊपर इतना खाली स्थान है। एनीमेशन को संरेखित करने के लिए आपको इसकी आवश्यकता है।

अब TexturePacker पर छवियों को खींचें और निम्नलिखित मापदंडों का चयन करें

  • डेटा प्रारूप: JSON हैश (या XML यदि आप चाहें तो)
  • TrimMode: ट्रिम (यह आयताकार बनाता है)
  • पिक्सेल प्रारूप: 8x PNGs (लगभग 70% कम मेमोरी) बनाने के लिए 8x - INDEXED
  • रोटेशन की अनुमति दें: गलत
  • डेटा के लिए फ़ाइल नाम दर्ज करें

TexturePacker छवियों को पैकिंग

परिणाम यह है कि अब आपको 2 फाइलें मिलती हैं: स्प्राइट शीट और एक JSON विवरण फ़ाइल।

"house_anim_01.png":
{
    "frame": {"x":351,"y":246,"w":110,"h":79},
    "rotated": false,
    "trimmed": true,
    "spriteSourceSize": {"x":67,"y":8,"w":110,"h":79},
    "sourceSize": {"w":400,"h":400},
    "pivot": {"x":0.5,"y":0.5}
},

महत्वपूर्ण भाग फ्रेम और स्प्राइट्स सोर्स हैं

फ्रेम आप स्प्राइट शीट में मूल स्प्राइट के स्थान देता है।

spriteSourceSize आपको चित्र बनाने के लिए ऑफसेट देता है - ट्रिमिंग के कारण छोड़ी गई छवि के भाग:

एक साधारण छद्म कोड ड्राइंग दिनचर्या इस तरह दिखता है:

drawImage(spritename, posX, posX)
{
    data    = sheetData[spritename]
    offsetX = data.spriteSourceSize.x
    offsetY = data.spriteSourceSize.y
    frameX  = data.frame.x
    frameY  = data.frame.y
    width   = data.frame.w
    height  = data.frame.h
    screen.draw(sheetImage, posX+offsetX, posY+offsetY, width, height)
}

आपको अपने ग्राफिक्स सिस्टम में धुरी बिंदु / उत्पत्ति के आधार पर ऑफसेट गणना को समायोजित करना पड़ सकता है। ऊपर दी गई दिनचर्या एक समन्वय प्रणाली मानती है जिसका मूल शीर्ष बचा है।

तो बस 2 पास में घर आकर्षित:

draw("background", 100, 100);
draw("anim_01", 100, 100);

आपको ऑफ़सेट के बारे में ध्यान रखने की ज़रूरत नहीं है - क्योंकि चित्र पहले से ही संरेखित हैं।


राम के उपयोग के बारे में अवलोकन के लिए +1, जिसे अन्य लोग नजरअंदाज कर रहे हैं
डैन हुल्मे

@ और मैं उस की जाँच करूंगा। धन्यवाद। मुझ पर मत हंसो लेकिन मैं एक इंजन का उपयोग नहीं कर रहा हूं। यह ज्यादातर एनीमेशन और ड्रॉबल्स के साथ किया जाता है और यह एक आकर्षण की तरह काम करता है। मैं स्मृति में सभी छवियों को लोड नहीं करता कोई अन्य बुद्धिमान यह दुर्घटनाग्रस्त हो जाएगा। यह फिलहाल प्रदर्शन के लिए आवश्यक छवियों को लोड करता है .. क्या आपको लगता है कि उपरोक्त सुझाव मानक एंड्रॉइड एसडीके के साथ काम करेगा?
स्नेक

1
हाँ यह होगा। TexturePacker स्प्राइट्स को ट्रिम करने के लिए 2 मोड हैं: आयताकार और बहुभुज। यदि आप आइसोमेट्रिक छवियों का उपयोग करते हैं तो आपको पैकिंग के मामले में बहुभुज की जाली से बड़ा लाभ मिल सकता है। सवाल यह है कि क्या आप बनावट वाले त्रिकोणों को आकर्षित करने में सक्षम होंगे - या एक मुखौटा के साथ आयताकार। यदि यह ऐसा नहीं है, तो आप अभी भी आयतों का उपयोग कर सकते हैं। यदि आप ड्रॉपबॉक्स का उपयोग करना चाहते हैं तो आप मुझे अपनी कुछ छवियां भेज सकते हैं और कोडएंडवेब पर -> समर्थन भेज सकते हैं। com। मैं उन्हें साझा नहीं करूंगा - बस यह देखने के लिए इच्छुक हूं कि पैकिंग को बेहतर बनाने के लिए हम क्या कर सकते हैं।
एंड्रियास लोव

@ AndreasLöw मुझे बहुत खेद है, मुझे आपकी टिप्पणी की सूचना नहीं मिली। मैंने अभी देखा। मैं मदद की बहुत सराहना करूंगा। मैं तुम्हें कुछ भेजूंगा और हो सकता है कि तुम मेरे बारे में प्रकाश डाल सको। ..किंडा मेरे साथ लिट्टी-चोखा में है और शायद आप प्रकाश डाल सकते हैं। मैं आपसे जल्द ही संपर्क करूंगा
स्नेक

7

यहाँ कुछ पॉइंटर हैं जिनका आप उपयोग कर सकते हैं

  1. यह सुनिश्चित करने की कोशिश करें कि आपकी सभी पृष्ठभूमि और गैर पारदर्शी छवियां PNG प्रारूप में नहीं हैं
  2. सभी एनीमेशन लूप-सक्षम होने का प्रयास करें अर्थात यदि एनीमेशन 1,2,3,4,5,6 है, तो इसे 1,2,3,4,3,2,1 की तरह बनाने की कोशिश करें जहाँ ये संख्याएँ एनीमेशन की फ़्रेम संख्या हैं, यह बहुत मदद करता है
  3. यदि कई चित्र समान हैं और केवल रंग भिन्न हैं (आमतौर पर यूआई बटन, एम कण एनिमेशन, गेम सिक्के) तो एक सफेद छवि लेने की कोशिश करें और अपने रंग को गतिशील रूप से बदलें
  4. अपने .apk को केवल उन छवियों के साथ बनाने की कोशिश करें जो बेहद महत्वपूर्ण हैं और फिर एक सर्वर से सब कुछ लोड करते हैं और फोन मेमोरी में रखते हैं

मुझे उम्मीद है कि ये संकेत मदद करेंगे

पीएस मैं केवल सामान्यीकृत विचार दे रहा हूं क्योंकि मुझे आपकी सटीक गेम सामग्री और माफी के बारे में पता नहीं है अगर ये पॉइंटर्स उपयोगी नहीं हैं


आप यह भी कर सकते हैं: 1) अपनी सभी छवियों को संपीड़ित करें 2) जितनी बार संभव हो उतनी टाइल्स का उपयोग करें 3) एक बड़ी छवि में एक साथ छवियों को समेटें और उपयोग करने के लिए यूवी मानचित्र के रूप में उपयोग करें
एंथनी रायमोंडो

वे महान सुझाव हैं। धन्यवाद। मुझे लगता है कि सबसे महत्वपूर्ण बिंदु है 4. हालांकि अगर ऐसा है तो मैं उन्हें अलग-अलग ड्रा करने योग्य फ़ोल्डर में कैसे रखूं और उन्हें R.drawable.image1 की तरह संदर्भ दूं? यही वह जगह है जहाँ मैं उलझन में हूँ
स्नेक

4

बहुत सारे खेल अपनी ग्राफिकल संपत्ति को .apk में नहीं रखते हैं; वे केवल यूआई ग्राफिक्स और गेम कोड की तरह "मूल बातें" शामिल करते हैं और एक बार गेम इंस्टॉल होने के बाद बाकी की संपत्ति डाउनलोड करते हैं। यह उन खेलों के लिए विशेष रूप से सच है जो आपके प्रदर्शन के रिज़ॉल्यूशन के आधार पर अलग-अलग ग्राफिक संसाधनों का उपयोग करते हैं। कम-रेस और हाय-रेस संपत्ति दोनों को रखने के लिए .apk रखने के लिए।

आपको अन्य उत्तरदाताओं द्वारा प्रदान किए गए दोनों अनुकूलन विकल्पों को देखना चाहिए, साथ ही साथ आपको अंततः अपने गेम के ग्राफिक्स को .apk से अलग करना होगा या नहीं।


मेरे पास सर्वर (या यहां तक ​​कि फाइलों के विस्तार) से ग्राफिक्स प्राप्त करने के लिए कोई समस्या नहीं है, लेकिन मैं उन्हें कैसे आकर्षित करने योग्य फ़ोल्डर में रखता हूं, इसलिए मैं उन्हें R.drawable.x द्वारा संदर्भित कर सकता हूं क्योंकि मेरे अधिकांश (कई) xmls उन्हें R का उपयोग करके संदर्भित कर रहे हैं वापस लेने योग्य
नाग

AFAIK, आप नहीं कर सकते। एक समाधान यह है कि संसाधन ID से जुड़ी संसाधन फ़ाइल नाम की एक हैश तालिका रखें, और उन ID के आधार पर फ़ाइलों को हथियाने के लिए AssetManager का उपयोग करें, लेकिन यदि आप इस मार्ग पर जाते हैं तो आपको अपनी .xml फ़ाइलों को पुनः प्राप्त करना पड़ सकता है।
सैंडलफुट

4

मैं इसी तरह के प्रश्न की तलाश में इस साइट पर आया था और वास्तव में कुछ अच्छे संसाधन हैं जिन्होंने आपके प्रश्न के उत्तर और अन्य प्रश्नों में दोनों को इंगित किया है।

आपको शायद 2 डी एनीमेशन पर एक नज़र रखना चाहिए : एनिमेटेड 3 डी मॉडल या एनीमेशन फ्रेम के साथ स्प्राइट? विभिन्न प्रकार के एनीमेशन पर कुछ बहस के लिए। इसने मुझे मेरे खेल को अनुकूलित करने में मदद की। इसके अलावा, आप हमें यह नहीं बताएंगे कि आप किस एपीआई का उपयोग कर रहे हैं या आप किस इंजन का उपयोग कर रहे हैं। अकेले यह काफी अंतर कर सकता है: पीएनजी एनीमेशन फ्रेम द्वारा एंड्रॉइड फ़्रेम

इसके अलावा, ध्यान रखें कि यदि आप संपीड़न मार्ग पर जाएंगे, तो आप कैसे संपीड़ित करते हैं, इसके बीच महत्वपूर्ण अंतर हो सकते हैं। विशेष रूप से, संपीड़न के प्रकारों के बीच काफी अंतर हैं और मोबाइल उपकरणों के लिए सबसे उपयुक्त मार्ग क्या है, इस पर कुछ विशेष बहस है। विशेष रूप से यदि आप ध्यान में रखते हैं कि मोबाइल के लिए, रैम उपयोग और लोडिंग के लिए सीपीयू अपशिष्ट भी सर्वोपरि हैं। देखें: http://www.gamasutra.com/blogs/AlexandruVoica/20130419/190833/Why_efficiency_is_key_in_texture_compression_standards_for_mobile_logics.php?print=1


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

बेनेटन, आपके द्वारा सुझाया गया अंतिम लिंक विशेष रूप से दिलचस्प है। साझा करने के लिए बहुत धन्यवाद! सुनिश्चित करें कि आप मेरे उत्तर में से अंतिम पर एक नज़र डालें, जो विभिन्न फ़ाइल प्रकारों के लिए अलग-अलग संपीड़न के मुद्दे को भी छूता है। वास्तव में, वहाँ संपीड़न प्रकार है कि पहले से ही संकुचित छवि प्रकार PNG, या असम्पीडित छवि प्रकार के साथ बेहतर के साथ काम करते हैं। प्रत्येक स्थिति के लिए प्रयोग करना हमेशा यह जांचने का सबसे अच्छा तरीका है कि प्रत्येक स्थिति के लिए सबसे अच्छा क्या है।
एमएएन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.