इस लेख में मैं एक मोबाइल गेम विकसित करने में अपना अनुभव साझा करना चाहता हूं, क्योंकि मैं एक विंडोज फोन डेवलपर हूं, मैं इस प्रणाली के साथ अपने अनुभव के बारे में बात करूंगा।
स्मृति और बनावट
यदि आप पहले से ही मोबाइल गेम विकसित कर रहे हैं, तो मुख्य बुराई सीपीयू / जीपीयू संसाधनों की कमी नहीं है, बल्कि स्मृति की कमी है। यह मेमोरी के बारे में है जिसे आपको पहले मोबाइल के विकास के बारे में सोचने की आवश्यकता है। विंडोज फोन 7 में, सीमा 100 एमबी थी, विंडो फोन 8 में यह बेहतर हो गया, लेकिन ज्यादा नहीं:
सीमा प्रकार | आवेदन का प्रकार | कम मेमोरी वाले फ़ोन | 1 जीबी फोन | 2 जीबी फोन |
चूक | XNA या देशी | 150 एमबी | 150 एमबी | 150 एमबी |
चूक | XAML / .NET XNA को छोड़कर | 150 एमबी | 300 एमबी | 300 एमबी |
उच्चतर | सभी ऐप प्रकार | 180 एमबी | 380 एमबी | 570 एमबी |
और यदि आप एक ऐसा खेल विकसित कर रहे हैं जिसमें काफी बड़ी संख्या में स्प्राइट्स (निश्चित रूप से, एटलस में) हैं, तो जल्द ही या बाद में आप इन एटलस और बनावट संपीड़न की संख्या के बारे में सोचेंगे।
मानक एटलस, जिसके साथ कम या ज्यादा स्वाभिमानी उपकरण काम करते हैं, 2048x2048 पिक्सेल है। कि असम्पीडित रूप में (प्रति पिक्सेल 32 बिट्स) 2 * 2 * 4 = 16 एमबी की मेमोरी पर कब्जा कर लेगा। फिर बनावट संपीड़न प्रारूप बचाव के लिए आते हैं, हमारे मामले में यह डीएक्सटी संपीड़न है।
संपीड़ित बनावट को न केवल कम वीडियो कार्ड मेमोरी की आवश्यकता होती है, बल्कि आम तौर पर बैंडविड्थ की कम आवश्यकताओं के कारण, असम्पीडित बनावट की तुलना में तेज़ी से प्रदर्शित होती है। लेकिन संपीड़न के कारण कुछ छवि गुणवत्ता खो सकती है। फिर भी, स्मृति में कमी से बनावट के संकल्प को बढ़ाने की अनुमति मिलती है, जो वास्तव में गुणवत्ता में महत्वपूर्ण लाभ दे सकती है।
Dxt संपीड़न को पहले से ही .XNA फ्रेमवर्क, साथ ही मोनोगेम में लागू किया गया है।
स्पष्टता के लिए, हम आकार में 128x128 पिक्सेल के 256 चित्र लेते हैं, इन बनावटों की एक बनावट 2048 * 2048 आकार की होती है, और इस एटलस को संपीड़ित करते हैं।
अफवाह यह है कि बनावट तेजी से भरी हुई हैं, जिनमें से आकार दो की शक्ति का एक गुण है, प्रयोग के लिए हम मूल बनावट को थोड़ा बदल देंगे, एक पिक्सेल काट देंगे, जिससे यह 2048 * 2047 के आकार में आ जाएगा।
वर्णित विधियों की प्रभावशीलता दिखाने के लिए, हम नियंत्रण माप करते हैं। हम उन्हें नोकिया लूमिया 800 फोन पर आयोजित करेंगे। अधिक सटीकता के लिए, हम प्रत्येक विधि के लिए 10 माप करेंगे।
हम तालिका 1 में परिणामों का सारांश और सारांश देते हैं।
तालिका 1. छवि डाउनलोड गति।
| 128 * 128 की 256 बनावट | 1 dxt 2048 * 2048 | 1 मूल 2048 * 2048 | 1 मूल 2048 * 2047 |
1 | 00: 00: 00.6460000 | 00: 00: 00.0330000 | 00: 00: 00.1510000 | 00: 00: 00.1200000 |
2 | 00: 00: 00.6440000 | 00: 00: 00.0330000 | 00: 00: 00.1510000 | 00: 00: 00.1180000 |
3 | 00: 00: 00.6470000 | 00: 00: 00.0410000 | 00: 00: 00.1870000 | 00: 00: 00.1570000 |
4 | 00: 00: 00.6400000 | 00: 00: 00.0330000 | 00: 00: 00.1490000 | 00: 00: 00.1190000 |
5 | 00: 00: 00.6420000 | 00: 00: 00.0330000 | 00: 00: 00.1500000 | 00: 00: 00.120000 |
6 | 00: 00: 00.6340000 | 00: 00: 00.0470000 | 00: 00: 00.1320000 | 00: 00: 00.161000 |
7 | 00: 00: 00.6340000 | 00: 00: 00.0500000 | 00: 00: 00.1590000 | 00: 00: 00.179000 |
8 | 00: 00: 00.6300000 | 00: 00: 00.0500000 | 00: 00: 00.1580000 | 00: 00: 00.179000 |
9 | 00: 00: 00.6330000 | 00: 00: 00.0480000 | 00: 00: 00.1580000 | 00: 00: 00.179000 |
10 | 00: 00: 00.6210000 | 00: 00: 00.0470000 | 00: 00: 00.1650000 | 00: 00: 00.1820000 |
औसत | 00: 00: 00.6371000 | 00: 00: 00.0412000 | 00: 00: 00.1558000 | 00: 00: 00.1514000 |
स्पष्टता के लिए, समय पर विभिन्न लोडिंग विधियों की निर्भरता का एक ग्राफ (चित्र। 1.)

चित्रा 1. समय पर विभिन्न लोडिंग विधियों की निर्भरता का ग्राफ।
तालिका 2. छवि आकार
| तरीकों | आकार, एमबी |
1 | आकार 256 बनावट 128 * 128 | 16 |
2 | संपीड़न के बिना बनावट का आकार 2048 * 2048 | 16 |
3 | संपीड़न के साथ बनावट का आकार 2048 * 2048 | 4 |
जैसा कि हम प्रस्तुत Dxt प्रयोगों से देख सकते हैं, संपीड़न बहुत प्रभावी है। आइए इसे और अधिक विस्तार से विचार करें।
DXT संपीड़न (कभी-कभी S3 संपीड़न के रूप में भी जाना जाता है) वास्तव में बहुत सरल है। यहां बताया गया है कि यह कैसे काम करता है:
- छवि को 4x4 ब्लॉकों में विभाजित किया गया है
- प्रत्येक ब्लॉक के लिए, दो सबसे महत्वपूर्ण रंग हैं।
- परिणामी दो रंग 16 बिट्स में संग्रहीत किए जाते हैं, RGB 5.6.5 प्रारूप में
- ब्लॉक में 16 पिक्सल में से प्रत्येक के लिए, 2 बिट्स मूल्य जमा किए जाते हैं, यह दर्शाता है कि यह दो प्राथमिक रंगों के बीच कितनी दूर है
यह सरल सर्किट कई वास्तविक दुनिया की छवियों के लिए आश्चर्यजनक रूप से अच्छी तरह से काम करता प्रतीत होता है।
DXT सम्पीडन के लिए पाँच विकल्प हैं:
- DXT1 काम करता है जैसा कि मैंने ऊपर वर्णित किया है, साथ ही अल्फा चैनल को एन्कोड करने के लिए कुछ अतिरिक्त जादू
- DXT3 रंग DXT1 की तरह ही इनकोड किया गया है, और एक पिक्सेल में अल्फा चैनल मान के 4 बिट्स को भी संग्रहीत करता है
- डीएक्सटी 5 रंग को डीएक्सटी 1 के रूप में उसी तरह से एन्कोड किया गया है, और इसी तरह की योजना का उपयोग अल्फा चैनल को एनकोड करने के लिए किया जाता है
- DXT2 और DXT4 मानकीकृत करने का एक बहुत अच्छा विचार नहीं था और इसमें से कुछ भी अच्छा नहीं आया। आपको यह दिखावा करना चाहिए कि वे मौजूद नहीं हैं
DXT1 4x4 ब्लॉक पर 64 बिट्स का उपयोग करता है। 32-बिट असम्पीडित बनावट की तुलना में, यह 8x संपीड़न अनुपात है। DXT2-5 एक 4x4 ब्लॉक में 128 बिट्स का उपयोग करता है, जो 4x संपीड़न अनुपात देता है।
और अब बुरी खबर है: DXT संपीड़न हानिपूर्ण संपीड़न है। कभी-कभी वे बहुत बड़े हो सकते हैं। वास्तव में, यह कुछ छवियों के लिए बहुत अच्छी तरह से काम करता है और दूसरों के लिए बिल्कुल उपयुक्त नहीं है।
इसलिए, जब आप Dxt कंप्रेशन का उपयोग करना चाहते हैं, तो XNA में कहें, जब आप Texture प्रॉपर्टी को Texture फॉर्मेट पर सेट करते हैं, तो DxtCompressed, Content Pipeline पैरामीटर ऑटोमैटिकली DXT1 और DXT5 के बीच सेलेक्ट करता है, यह इस बात पर निर्भर करता है कि आपकी बनावट में अल्फा चैनल है या नहीं। यदि इसमें एक अल्फा चैनल नहीं है या एक समान अल्फा चैनल शामिल है, तो DXT1 का उपयोग सर्वोत्तम संपीड़न अनुपात प्राप्त करने के लिए किया जाएगा, लेकिन यदि बनावट में आंशिक अल्फा मान हैं, तो इसके बजाय यह DXT5 का चयन करेगा।
आइए हम संपीड़न विधियों में से प्रत्येक पर अधिक विस्तार से विचार करें:
DXT1
DXT1 प्रारूप को रेंडरिंग के दौरान वीडियो कार्ड पर हार्डवेयर द्वारा वास्तविक समय के विघटन के लिए डिज़ाइन किया गया है। DXT1 8: 1 के निश्चित संपीड़न अनुपात के साथ एक हानिपूर्ण संपीड़न प्रारूप है। डीएक्सटी 1 संपीड़न ट्रंकेशन (बीटीसी) द्वारा ब्लॉक कोडिंग का एक रूप है, जहां छवि को असंतुष्ट ब्लॉकों में विभाजित किया गया है, और प्रत्येक ब्लॉक में पिक्सेल को सीमित संख्या में मानों के लिए निर्धारित किया गया है। 4x4 पिक्सेल ब्लॉक में पिक्सेल के रंग मानों को RGB रंग स्थान से गुजरने वाली लाइन पर समवर्ती बिंदुओं से अनुमानित किया जाता है। इस लाइन को दो एंडपॉइंट्स द्वारा परिभाषित किया गया है, और 4x4 ब्लॉक में प्रत्येक पिक्सेल के लिए, लाइन पर एक समभुज बिंदुओं पर 2-बिट इंडेक्स संग्रहीत किया जाता है। रंग स्थान से गुजरने वाली रेखा के छोर 16-बिट 5: 6: 5 आरजीबी प्रारूप में एन्कोड किए गए हैं और एक या दो मध्यवर्ती बिंदु प्रक्षेप द्वारा उत्पन्न होते हैं। प्रारूप आपको अंतिम बिंदुओं के क्रम के आधार पर 1-बिट अल्फा चैनल को किसी अन्य मोड में स्विच करने की अनुमति देता है, जहां केवल एक मध्यवर्ती बिंदु बनाया जाता है और एक अतिरिक्त रंग का एक आउटपुट इंगित करता है कि यह काला और पूरी तरह से पारदर्शी है।
आइए नीचे चित्र 2 को देखें:
बाईं छवि मूल है। सही एक DXT1 संपीड़न दिखाता है।

चित्रा 2. Dxt1 संपीड़न का उदाहरण।
नेत्रहीन संकुचित छवि मूल से भिन्न नहीं होती है, जो संपीड़न परिणामों को अधिकांश उपयोगकर्ताओं के लिए स्वीकार्य बनाती है। संपीड़न, हालांकि, बनावट के आकार को महत्वपूर्ण रूप से कम कर देता है।
इस मामले में, 256 केबी से 32 केबी तक।
हालाँकि, इस बनावट के साथ सब कुछ इतना रसपूर्ण नहीं है (चित्र 3):

चित्रा 3. Dxt1 संपीड़न का एक उदाहरण।
मुख्य समस्या पाठ के अंदर शोर की उपस्थिति है, और ढाल पृष्ठभूमि के खिलाफ भी अलग-अलग बैंड दिखाई देते हैं।

चित्रा 4. पाठ के अंदर शोर।
चित्र 5 दिखाता है कि संपीड़न रंग को कैसे प्रभावित करता है। बाईं ओर आप शुद्ध लाल से शुद्ध काले तक, लाल के 16 रंगों को देखते हैं। दाईं ओर आप चार रंगों को देखते हैं जो कि इन 16 रंगों में से DXT संपीड़न के परिणामस्वरूप होते हैं।

चित्रा 5. रंग पर संपीड़न का प्रभाव।
चित्रा 6 से पता चलता है कि जब रंग अलग-अलग रंगों में एक ही पंक्ति में नहीं होते हैं तो क्या होता है। इस मामले में, आरजीबी पैलेट (लाल, हरा और नीला) के सभी चरम सीमाओं का उपयोग किया गया था। जाहिर है, परिणामस्वरूप प्रक्षेपित रंग मूल से मेल नहीं खाते। आमतौर पर 4x4 पिक्सेल क्षेत्र में रंगों का इतना व्यापक चयन नहीं होता है, लेकिन यह दर्शाता है कि विभिन्न रंगों वाले बनावट अधिक पीड़ित हैं।

चित्रा 6. रंग पर संपीड़न का प्रभाव।
DXT1 संपीड़न आमतौर पर शोर बनावट के लिए अच्छी तरह से काम करता है और स्वच्छ छवियों के साथ-साथ ग्रेडिएंट के लिए भी अच्छा नहीं है। चाल यह है कि जहाँ भी संभव हो इसका उपयोग करें और इसका उपयोग केवल बनावट पर न करें जहां संपीड़न कलाकृतियाँ बहुत अवांछनीय हैं।
DXT5
DXT5 प्रारूप DXT3 प्रारूप से अलग है कि यह अल्फा चैनल जानकारी संग्रहीत करता है, बहुत कुछ रंग जानकारी संग्रहीत करने की तरह।
अल्फा चैनल के बारे में जानकारी के लिए, वह उसी तरह पैलेट का उपयोग करता है जिस तरह से डिजिटल जानकारी संग्रहीत की जाती है। इस पैलेट में न्यूनतम और अधिकतम अल्फा चैनल मान होता है। 6 और 4 संदर्भ बिंदुओं के साथ दो विकल्प हैं।
इस न्यूनतम और अधिकतम के बीच 6 अन्य अल्फा मान प्रक्षेपित होते हैं। इस प्रकार, यह अल्फा मूल्य में अधिक क्रमिक परिवर्तनों की अनुमति देता है।
दूसरा विकल्प न्यूनतम और अधिकतम मूल्यों के बीच केवल 4 अन्य अल्फा चैनल मूल्यों को प्रक्षेपित करता है, लेकिन अल्फा मान 0 और 1 को जोड़ता है (पूरी तरह से पारदर्शी और पारदर्शी नहीं)। कुछ बनावटों के लिए, यह बेहतर परिणाम दे सकता है।

चित्रा 7. Dxt5 संपीड़न का उदाहरण।
जैसा कि आप देख सकते हैं, किनारों को कुछ हिस्सों में बहुत अच्छी तरह से संसाधित नहीं किया गया है।

चित्रा 8. Dxt5 संपीड़न का उपयोग करते समय फटे किनारों।
बनावट का आकार 256 KB से घटाकर 64 KB कर दिया गया था।
वास्तविक छवियों में गुणवत्ता के नुकसान इतने महत्वपूर्ण नहीं हैं और अधिकांश छवियों के लिए उन्हें उपेक्षित किया जा सकता है।
Dxt सम्पीडन का उपयोग करने की अनुमति देता है:
- स्थापना पैकेज का आकार कम करें
- रैम का उपयोग कम करें
- "रेंडरिंग" छवियों की गति बढ़ाएं
मेरी परियोजना में, बनावट एटलस बनाने के बाद, मुझे आउटपुट .jpg / .png / .bmp और .xml / .txt / .json में एटलस का विवरण मिलता है। चूँकि मैं .xnb में कम्प्रेशन के लिए XNA / Monogame का उपयोग करता हूँ, इसलिए मैं
XNA 4.0 कंटेंट कंपाइलर का उपयोग करता हूँ, यह एक बहुत ही स्पष्ट और सरल उपाय है, केवल Dxt कंप्रेशन का उपयोग करने के लिए आपको बिल्डप्रूजेक्ट बनाते समय ContentBuble में एक और प्रॉपर्टी जोड़ने की आवश्यकता है:
buildProject.SetProperty(“XnaCompressContent“, “True”);
सूत्रों का कहना है:
S3 बनावट संपीड़नDXT संपीड़न समझायाDXT संपीड़न तकनीकवास्तविक समय YCoCg-DXT संपीड़न