परिसंपत्ति मैनिफ़ेस्ट फ़ाइलों का उपयोग क्यों करें?


12

कभी-कभी आप देखेंगे कि लोग ग्राफिक्स / साउंड फ़ाइलों / आदि का उपयोग करने की सलाह देते हैं। इस तरह...

// Game code
Image myImage = new Image("path/to/image.png");

... आपको इसके बजाय अप्रत्यक्ष स्तर के रूप में एक मैनिफ़ेस्ट फ़ाइल का उपयोग करना चाहिए :

// Manifest file
MY_IMAGE: path/to/image.png

// Game code
Manifest myManifest = new Manifest("path/to/manifest");
Image myImage = myManifest.getImage("MY_IMAGE");

इस तरह के दृष्टिकोण को लेने के मेरे पास क्या कारण होंगे? यदि मैं संकलित भाषा का उपयोग नहीं कर रहा हूं, तो क्या ऐसा करने के लिए अभी भी कारण होंगे?

जवाबों:


8

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

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

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


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

4

एक कारण: डेटा संचालित प्रोग्रामिंग।

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

<material name="wood">
  <diffuse color="1,1,1,1">environment.zip/wood_diffuse.jpg</diffuse>
  <normals>environment.zip/wood_normals.jpg</normals>
  <shader>environment.zip/wood.fx</shader>
  <specular color="1,1,1,1" power="0.5" flat="yes" />
</material>

2

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

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

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


1

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


0

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

यहाँ एक सरल ठोस उदाहरण है जहाँ संसाधन नाम / स्थान पृथक्करण ने मेरी मदद की। जबकि विकास में मेरी कला संपत्ति स्रोत कोड के साथ संशोधन नियंत्रण में हैं। यह बहुत सुविधाजनक है और मुझे जल्दी से पुनरावृत्त करने की अनुमति देता है। आमतौर पर संसाधन का नाम यह दर्शाता है कि यह स्थान है। विकास का प्रकटन बहुत सीधा है।

मैं आस-पास बिखरी हुई संपत्ति के साथ एक खेल वितरित नहीं करना चाहता। इसलिए जब मैं इसे वितरित करने के लिए तैयार हूं तो मैं अपनी संपत्तियों को आसानी से एक संसाधन फ़ाइल में बदल सकता हूं और एक नया प्रकट निर्माण कर सकता हूं।

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

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