बनावट हमेशा दो की वर्ग शक्तियां क्यों होती हैं? अगर वे नहीं हैं तो क्या होगा?


53

खेलों में बनावट का संकल्प हमेशा दो की शक्ति (128x128, 256x256, 512x512, 1024x1024, आदि) क्यों होता है? क्या यह गेम के फ़ाइल साइज़ को बचाने के लिए स्मार्ट नहीं होगा और बनावट को यूवी अलिखित मॉडल के अनुरूप बनाएगा?

अगर कोई बनावट होती जो दो की शक्ति नहीं होती तो क्या होता?

क्या यह गलत होगा कि कोई बनावट 256x512, या 512x1024 जैसी होगी? या इससे उन समस्याओं का कारण होगा जो गैर-शक्ति-दो बनावट के कारण हो सकती हैं?


9
आपके अन्य उदाहरण भी दो की शक्तियाँ हैं, न कि दो की समान शक्ति। दो की शक्तियां ग्राफिक्स हार्डवेयर के लिए बनावट को अनुकूलित बनाती हैं।
MichaelHouse

1
@ बाइट 56 मुझे लगता है कि उसका मतलब 2 ^ nx 2 ^ n बनावट है, जहाँ n 1 से अनंत तक भिन्न होता है। (वास्तव में अनंत नहीं।)
रॉबिन

इस बात पर भी ध्यान दें कि दो की शक्तियों से मिपमैप को तुच्छ बनाने का लाभ है।
पबबी

क्योंकि बनावट सामान्य रूप से लपेटती है (हालाँकि आप इसे कस्टम शेडर में चुन सकते हैं) आपको किसी भी स्थान को बर्बाद करने की आवश्यकता नहीं है, बस अपने पॉलीगॉन यूवी को किनारों के चारों ओर समन्वयित करें और आप उपलब्ध स्थान का उपयोग बहुत आसानी से कर सकते हैं। यदि आपको चौड़ाई = ऊँचाई = 2 ^ n बनावट से चिपके रहने के लिए इसकी सबसे सुरक्षित आवश्यकता को दबाने की आवश्यकता नहीं है क्योंकि यह थोड़े अधिक जटिल uv लेआउट की कीमत पर हार्डवेयर की एक विस्तृत श्रृंखला की अनुमति देगा।
डैनियल कार्लसन

वे हमेशा दो की शक्तियां नहीं हैं
आलमो

जवाबों:


49

खेलों में बनावट का संकल्प हमेशा दो की शक्ति (128x128, 256x256, 512x512, 1024x1024, आदि) क्यों होता है?

जैसा कि बट्टे 56 ने कहा है, "दो" आकार प्रतिबंधों की शक्ति (हैं) कि प्रत्येक आयाम स्वतंत्र रूप से, दो की शक्ति होना चाहिए, न कि बनावट चौकोर होनी चाहिए और वे आयाम हैं जो दो की शक्ति हैं।

हालांकि, आधुनिक कार्ड और कौन से आधुनिक ग्राफिक्स एपीआई पर, इस "प्रतिबंध" में काफी आराम दिया गया है कि बनावट आयाम, कारण के भीतर हो सकते हैं, बस कुछ भी आप के बारे में पसंद करते हैं। हालाँकि:

क्या यह गेम के फ़ाइल साइज़ को बचाने के लिए स्मार्ट नहीं होगा और बनावट को यूवी अलिखित मॉडल के अनुरूप बनाएगा? अगर कोई बनावट होती जो दो की शक्ति नहीं होती तो क्या होता?

यह सुनिश्चित करके कि बनावट के आयाम दो की शक्ति हैं, ग्राफिक्स पाइपलाइन दो की शक्तियों के साथ काम करने में दक्षता से संबंधित अनुकूलन का लाभ उठा सकती है। उदाहरण के लिए, यह (और पूरी तरह से कई साल पहले किया गया था जब हम GPU और अत्यंत चतुर अनुकूलन संकलक समर्पित किया था) तेजी से विभाजित और दो की शक्तियों से गुणा करने के लिए। पाइप लाइन के भीतर दो के सरलीकृत संचालन में भी काम करना, जैसे कि मिपमप्स की गणना और उपयोग (एक संख्या जो दो की शक्ति है, हमेशा आधे में समान रूप से विभाजित होगी, जिसका अर्थ है कि आपको उन परिदृश्यों से निपटने की ज़रूरत नहीं है जहां आपको गोल होना चाहिए आपके mipmap आयाम ऊपर या नीचे)।

यह सच है कि आप इस तरह से कुछ जगह "बर्बाद" करते हैं, लेकिन अतिरिक्त स्थान आम तौर पर प्रदर्शन में व्यापार के लिए इसके लायक है। इसके अतिरिक्त तकनीकें भी हैं, जैसे एक ही बनावट के स्थान में कई छवियों को संपीड़ित करना या पैक करना जो कुछ भंडारण कचरे को कम कर सकते हैं।


11
"यह सच है कि आप इस तरह से कुछ जगह" बर्बाद "करते हैं, लेकिन अतिरिक्त स्थान आमतौर पर प्रदर्शन प्रदर्शन में ट्रेडऑफ के लिए इसके लायक है।" - लगभग दस साल पहले मैंने एक स्टूडियो में काम किया था जो एक्सबॉक्स पर एक पीएस 2 गेम को पोर्ट कर रहा था। जबकि PS2 तकनीकी रूप से गैर-शक्ति-दो पाठों का समर्थन नहीं करता है, आप कुछ मामलों में, इसे थोड़ा चालाक हेरफेर और कोई गति हानि के साथ ऐसा करने के लिए मजबूर कर सकते हैं। दूसरी ओर, XBox ने पूरी तरह से उनका समर्थन नहीं किया। अंतिम परिणाम यह है कि X2 को PS2 की रैम से लगभग दोगुना होने के बावजूद, हमें फिट होने के लिए कुछ बनावट को नीचे करना पड़ा।
ज़ोरबहुत

मुझे एक प्रशस्ति पत्र खोजने में कठिन समय हो रहा है, लेकिन मैंने पहले पढ़ा है कि जेपीईजी छवियां अधिकतम दक्षता के लिए 8 के गुणक पर होनी चाहिए, क्योंकि इसके बाहर कुछ भी अभी भी 8x8 ब्लॉक की आवश्यकता है।
सालमोनमोज़

1
@ साल्मोन्मोज़: सही; जेपीईजी 8x8 के प्रत्येक ब्लॉक को स्वतंत्र रूप से संपीड़ित करता है और किनारे पर ब्लॉक ब्लॉक करेगा। लेकिन इस प्रश्न से कोई संबंध नहीं है।
MSalters

1
जेपीईजी 8x8 ब्लॉकों में एन्कोड किए गए हैं, हां। हालांकि यह वास्तव में एक दक्षता विचार नहीं है। और यह जरूरी नहीं कि 2 की शक्ति हो। :)
कियलोतन

एक उदाहरण एंड्रॉइड पर है, जहां अक्सर गैर-पावरफुटो बनावट के परिणामस्वरूप सफेद बनावट होती है।
user717572

17

बनावट हमेशा दो की वर्ग शक्तियां क्यों होती हैं?

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

  • बनावट में आमतौर पर वर्ग होने की आवश्यकता नहीं होती है - हालाँकि DirectX में D3DPTEXTURECAPS_SQUAREONLYक्षमता होती है लेकिन मैंने पुराने हार्डवेयर में बिना किसी समस्या के भी गैर-वर्ग बनावट के साथ काम किया है।
  • बनावट दो की शक्ति होनी चाहिए क्योंकि कई पुराने ग्राफिकल कार्डों को अभी भी इसकी आवश्यकता है। उस प्रतिबंध का कारण यह था कि वे बनावट मानचित्रण कार्यों के लिए कुछ अनुकूलन कर सकते थे। अधिकांश आधुनिक ग्राफिक कार्ड में यह प्रतिबंध नहीं है।

12
यह ध्यान दिया जाना चाहिए कि "पुराने चित्रमय कार्ड" से उनका मतलब है कि 2006 या उससे पहले का बना सामान।
निकोल बोलस

1
@ निचलोलस धन्यवाद, मैं वास्तव में उस बिंदु पर कुछ संदर्भ खोजने की कोशिश कर रहा था।
डेविड गॉविया

7

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

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


6

समस्या यह है कि कुछ हार्डवेयर में बनावट के लिए सीमित समर्थन है जिसमें दो आयामों की शक्ति नहीं है।

उदाहरण के लिए, http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspx के नीचे देखें और वहां फुटनोट्स 3 और 4 पढ़ें।

3 फीचर स्तर 9_1, 9_2 और 9_3 पर, डिस्प्ले डिवाइस उन आयामों के साथ 2-डी बनावट के उपयोग का समर्थन करता है जो दो शर्तों के तहत दो की शक्ति नहीं हैं। सबसे पहले, प्रत्येक बनावट के लिए केवल एक एमआईपी-मैप स्तर बनाया जा सकता है, और दूसरा, बनावट के लिए कोई रैप सैंपलर मोड की अनुमति नहीं है (जो कि, पते, पते, और डीडब्लूडी 11_SAMPLER_DRC के सदस्यों को D3D11_TEXTURE_ADDRESS_WRAP पर सेट नहीं किया जा सकता है)।

4 फीचर स्तरों पर 10_0, 10_1 और 11_0, प्रदर्शन डिवाइस बिना किसी आयाम के 2-डी बनावट के उपयोग का समर्थन करता है जो दो की शक्ति नहीं है।


6

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

फ्रेम बफर टुकड़ों से बना है जो वर्ग हैं। उदाहरण के लिए स्क्रीन में रिज़ॉल्यूशन 800x600 और RGB कलर स्पेस (0-255) में 3 बाइट्स के साथ 800x600 पॉइंट्स होते हैं। प्रत्येक चैनल में 3x800x600 = 1,440,000 बाइट्स होते हैं, जो फ्रेम बफर में पता करने के लिए कुल होते हैं। इसका मतलब है कि 1,875 पते योग्य टुकड़े हैं जो 256x256x3 बाइट्स हैं। क्योंकि बनावट डेटा वर्गाकार होता है इसलिए यह GRAM मैट्रिक्स से स्क्रीन बफर मैट्रिक्स के लिए बाइबिक स्केलिंग का उपयोग करते हुए मैप करना बहुत आसान बनाता है, जैसे कि यदि यह पक्षपात को अधिक समय के लिए पूर्वाग्रह नहीं करता था तो गणना के लिए अधिक समय लगेगा जब इसकी आवश्यकता होती है तराशा हुआ।

कई ग्राफिक्स एपीआई गैर-वर्ग बनावट डेटा को स्वीकार करेंगे, क्योंकि वे यूवी मैपिंग निर्देशांक को फ्लोटिंग पॉइंट डेटा के रूप में स्वीकार करते हैं, हालांकि एक बार जब यह जीपीयू को भेजा जाता है, तो बनावट डेटा में पैडिंग को जोड़ा जाता है, क्योंकि छवि के वास्तविक अनुपात मैपिंग को नहीं बदलते हैं। अप्रभावित प्रतीत होता है, हालांकि बनावट डेटा में पैडिंग को जोड़ा जाता है, क्योंकि GPU इसे एक पूर्ण वर्ग के रूप में संबोधित करना पसंद करता है।

तो अगर एक 100x1024 छवि का उपयोग किया जाता है, और 1024x1024 की छवि का उपयोग किया जाता है, जिसका अर्थ है कि 946,176 बाइट बर्बाद हो जाते हैं। इससे भी ज्यादा अगर कंपोजिंग करनी है, क्योंकि यह बताने के लिए कि अल्फा डेटा को जोड़ा जाना चाहिए, ताकि पैडिंग डेटा कंपोजिट टेक्सचर पर असर न करे।


यह एक दिलचस्प स्पष्टीकरण है (वर्ग मैट्रिसेस के बारे में शीर्षक) जो 2 उत्तरों (+1) की सामान्य शक्ति में नहीं पाया जाता है - क्या आप संभव होने पर कुछ उद्धरण प्रदान कर सकते हैं?
समरसता

1

हमारी डिजिटल दुनिया द्विआधारी संख्या के साथ काम करती है फिर 2 से गुणा करने या विभाजित करने के लिए एक मूल्य जिसे आप "मूव" कर सकते हैं बाईं ओर या उससे अधिक मान सकते हैं

<<  Left shift      x = 5 << 1    0101 << 1     1010     10
>>  Right shift     x = 5 >> 1    0101 >> 1     0010      2

एक सीपीयू के लिए "दो की शक्ति" मूल्यों के साथ काम करना आसान है।


0

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

जैसा कि यह हार्डवेयर निर्भर है और विक्रेताओं को आमतौर पर इन विवरणों की बारीकियों में नहीं मिलेगा, सबसे सुरक्षित बात यह है कि बनावट के लिए दो आयामों की शक्ति का उपयोग जारी रखना है, ताकि GPU राम को बर्बाद न करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.