संसाधन प्रबंधक - क्या वे कोई अच्छे हैं?


20

मैंने स्रोत कोड में कई बार देखा है, इस तरह की चीजें [ठीक है, यह एक छद्म सी ++ का अधिक विचार है]

typedef shared_ptr<Resource> ResourcePtr;// for ease  
ResourcePtr sound1 = resourceManager.Get<SoundResource>("boom.ogg");  
sound1->Play();  
ResourcePtr sprite = resourceManager.Get<Image>("sprite.png");

मैं सोच रहा था कि इस तरह एक वर्ग कितना उपयोगी था, कुछ ऐसा:

  • भरी हुई मीडिया फाइलें
  • उन्हें स्मृति में संग्रहित किया
  • एक स्तर लोड हो रहा है स्क्रीन की शुरुआत में यह किया।
  • सफाई की

की एक प्रणाली होने के बजाय:

  • संसाधन केवल संस्थाओं द्वारा आयोजित किए जाते हैं, या ढीले होते हैं।
  • स्मृति में खुद के भार के लिए जिम्मेदार।

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



1
बिल्कुल नहीं। मुझे लगता है कि यह एक वैध प्रश्न है।
R

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

मुझे नहीं लगता कि मैं एक ही बात पूछ रहा हूं। ऐसा प्रतीत होता है कि क्या आपके पास किसी प्रकार का फ़ाइल-पथ छोटा होना चाहिए, जबकि मैं एक प्रकार के संसाधन लोडर / कैश प्रकार के बारे में पूछ रहा हूं। हालाँकि, मुझे लगता है कि संपत्ति के बजाय मैंने संसाधन का उपयोग नहीं किया।
कम्युनिस्ट डक

2
@ ब्रायन, मैं असहमत हूं, "परिसंपत्ति प्रबंधक एक अच्छा विचार हैं" "आप संपत्ति प्रबंधकों को कैसे लागू करते हैं" की तुलना में एक अलग सवाल है। दी गई, कुछ लोग दूसरे प्रश्न के लिए पहले प्रश्न का उत्तर देने की कोशिश कर रहे थे, जिसके कारण बहुत सारे उत्तर ओवरलैप होंगे।
टेट्राद

जवाबों:


20

एक अच्छा रिसोर्स मैनेजर इस बात की कुंजी है कि आपका गेम 'इंजन' कितना अच्छा और कितना लचीला है।

यह न केवल निम्न स्तर के संसाधन प्रबंधन के साथ बहुत सारी समस्याओं को हल करता है, बल्कि यह सुनिश्चित करने में भी मदद करता है कि संसाधन केवल एक बार लोड किए जाते हैं, और फिर उनका पहले से लोड होने पर पुन: उपयोग किया जाता है।

यदि संसाधन प्रणाली अच्छी तरह से सारगर्भित है, तो अंतर्निहित विवरण फाइल सिस्टम, फिजियो स्टोरेज, एसक्यूएल के बीच भी भिन्न हो सकते हैं ...

आप बस एक संसाधन का अनुरोध करते हैं, और यह आपको दिया जाता है।

संसाधन आईडी और उस तरह के सामान के बारे में चिंता करने की कोई जरूरत नहीं है।

डुप्लिकेट संसाधन संघर्ष हैंडलिंग, आदि।

संसाधन प्रबंधक को इसे छाँटने दें।

इस बात पर निर्भर करता है कि आप इसे कैसे डिज़ाइन करते हैं - यदि C ++ तो अपने पड़ोसी वर्ग (तों) से दोस्ती करें ताकि यह सुनिश्चित हो सके कि स्वामित्व ठीक से संभाला हुआ है।

संसाधन संग्रह ?

कोई दिक्कत नहीं है।

संसाधनों को जारी करने की भूल?

कोई दिक्कत नहीं है।

संसाधनों के समान इंटरफ़ेस कोई फर्क नहीं पड़ता कि वे कहाँ हैं: मेमोरी, डिस्क, आर्काइव, नेटवर्क।

कोई दिक्कत नहीं है।

क्या आप स्ट्रीमिंग चाहते हैं?

थ्रेडिंग?

अपने संसाधन प्रबंधन केंद्र का ध्यान रखें।

और आप आश्वस्त रह सकते हैं कि संसाधनों के उपयोग के लिए तैयार होने पर यह आपको सूचित करेगा।

ओग्रे 3 डी में एक बहुत ही लचीला संसाधन प्रबंधन प्रणाली है, लेकिन मुझे यकीन है कि वहाँ अन्य लोग 'बाहर' हैं।


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

13

मैंने हाल ही में एक संसाधन प्रबंधक लिखा है जो मेरे मामले के लिए बहुत अच्छा काम करता है। मुख्य विशेषताएं:

  • उदाहरण के लिए, स्ट्रिंग आईडी द्वारा संसाधनों का अनुरोध किया जाता है ResourceManager::instance().getTexture("textures/player.png")। बनावट आईडी वर्तमान में डिस्क पर एक फ़ाइल में सीधे मैप की जाती है, जो विकास के दौरान सुविधाजनक है, लेकिन इसे बाद में कुछ संग्रह में देखने के द्वारा बदल दिया जाएगा।

  • संसाधन प्रबंधक संसाधनों के लिए ID के मानचित्र पर रखता है, इसलिए यह पहले से लोड किए गए संसाधन को पुनः लोड नहीं करेगा।

  • उपरोक्त कॉल एक Textureवस्तु को वापस नहीं करता है , बल्कि एक Resource<Texture>वस्तु नहीं है; कॉलर से Resource<Texture>ऑब्जेक्ट को स्टोर करने की अपेक्षा की जाती है न कि वास्तविक बनावट को। Resource<Texture>एक के लिए एक स्मार्ट सूचक की तरह काम करता Texture; इसकी वस्तु ही operator*()वापस आती Textureहै। लाभ यह है कि सभी ग्राहकों को अपडेट करने की आवश्यकता के बिना वास्तविक बनावट को फिर से लोड किया जा सकता है, या अनलोड किया जा सकता है।

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

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

  • जब कोई संसाधन नहीं मिल सकता है, या लोड करने में विफल रहता है, तो एक डिफ़ॉल्ट संसाधन चुपचाप प्रतिस्थापित किया जाता है। यह मुझे उन संसाधनों का उपयोग करने की अनुमति देता है जो मैंने अभी तक नहीं बनाए हैं, खेल को दुर्घटनाग्रस्त किए बिना। (नियोजित सुविधा: GPGPU शेड जैसे "आवश्यक" संसाधनों को इंगित करें, जिसके बिना खेल ठीक से नहीं चल सकता है।)

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

मुझे लगता है कि यह सुविधा सूची दर्शाती है कि, हाँ, संसाधन प्रबंधक अच्छे हो सकते हैं!


2

संसाधन प्रबंधक होने का एक कारण संसाधनों का साझाकरण है। उदाहरण के लिए, जब आप कॉल करते हैं resourceManager.Get("sprite.png"), यदि "sprite.png" पहले से लोड है, तो संसाधन प्रबंधक बस नई छवि बनाने और डिस्क से पुनः लोड करने के बजाय पहले से लोड किए गए स्प्राइट संसाधन के लिए एक पॉइंटर लौटा सकता है।

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

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


1

एक और लाभ यह है कि कैशिंग और रेफरेंस काउंटिंग के अलावा यह है कि यह निर्भरता को संभाल सकता है (मॉडल की जरूरत है बनावट बी? मैं इसे फिर से प्राप्त करूंगा!) और लोड ऑर्डर मुद्दों (मॉडल को यह जानने की जरूरत है कि shader b के लिए क्या आवश्यकता है? मुझे shader लोड करने दें? मॉडल लोड करने से पहले बी!

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