मैंने तय किया है कि मैं अपने शौक के खेल इंजन के लिए एक केंद्रीय संसाधन प्रबंधक / संसाधन श्रेणी लिखना चाहता हूं, लेकिन मुझे एक कैशिंग योजना को डिजाइन करने में परेशानी हो रही है।
यह विचार है कि सभी खेल के संसाधनों द्वारा संयुक्त कुल मेमोरी के लिए रिसोर्स मैनेजर का एक नरम लक्ष्य है। अन्य वर्ग संसाधन ऑब्जेक्ट बनाएंगे, जो एक अनलोड स्थिति में होंगे, और उन्हें संसाधन प्रबंधक के पास भेज देंगे। संसाधन प्रबंधक तब तय करता है कि दी गई संसाधनों को लोड / अनलोड करना है, नरम सीमा को ध्यान में रखते हुए।
जब किसी अन्य वर्ग द्वारा एक संसाधन की आवश्यकता होती है, तो इसके लिए ResourceManager को एक अनुरोध भेजा जाता है, (या तो स्ट्रिंग आईडी या विशिष्ट पहचानकर्ता का उपयोग करके)। यदि संसाधन लोड किया गया है, तो संसाधन को केवल पढ़ने के लिए कॉलिंग फ़ंक्शन को संदर्भित किया जाता है, (संदर्भित संदर्भित कमजोर_पर में लपेटा जाता है)। यदि संसाधन लोड नहीं किया गया है, तो प्रबंधक अगले अवसर पर लोड की जाने वाली वस्तु को चिह्नित करेगा, (आमतौर पर फ्रेम खींचने के अंत में)।
ध्यान दें कि, हालांकि मेरा सिस्टम कुछ संदर्भ गिनती करता है, यह केवल तभी गिना जाता है जब संसाधन पढ़ा जा रहा हो, (इसलिए संदर्भ संख्या 0 हो सकती है, लेकिन एक इकाई अभी भी इसे ट्रैक कर रही है)।
पहले उपयोग के लिए अच्छी तरह से लोड करने के लिए संसाधनों को चिह्नित करना भी संभव है। यहाँ उन वर्गों का एक स्केच है जो मैं उपयोग कर रहा हूँ:
typedef unsigned int ResourceId;
// Resource is an abstract data type.
class Resource
{
Resource();
virtual ~Resource();
virtual bool load() = 0;
virtual bool unload() = 0;
virtual size_t getSize() = 0; // Used in determining how much memory is
// being used.
bool isLoaded();
bool isMarkedForUnloading();
bool isMarkedForReload();
void reference();
void dereference();
};
// This template class works as a weak_ptr, takes as a parameter a sub-class
// of Resource. Note it only hands give a const reference to the Resource, as
// it is read only.
template <class T>
class ResourceGuard
{
public:
ResourceGuard(T *_resource): resource(_resource)
{
resource->reference();
}
virtual ~ResourceGuard() { resource->dereference();}
const T* operator*() const { return (resource); }
};
class ResourceManager
{
// Assume constructor / destructor stuff
public:
// Returns true if resource loaded successfully, or was already loaded.
bool loadResource(ResourceId uid);
// Returns true if the resource could be reloaded,(if it is being read
// it can't be reloaded until later).
bool reloadResource(ResourceId uid)
// Returns true if the resource could be unloaded,(if it is being read
// it can't be unloaded until later)
bool unloadResource(ResourceId uid);
// Add a resource, with it's named identifier.
ResourceId addResource(const char * name,Resource *resource);
// Get the uid of a resource. Returns 0 if it doesn't exist.
ResourceId getResourceId(const char * name);
// This is the call most likely to be used when a level is running,
// load/reload/unload might get called during level transitions.
template <class T>
ResourceGuard<T> &getResource(ResourceId resourceId)
{
// Calls a private method, pretend it exits
T *temp = dynamic_cast<T*> (_getResource(resourceId));
assert(temp != NULL);
return (ResourceGuard<T>(temp));
}
// Generally, this will automatically load/unload data, and is called
// once per frame. It's also where the caching scheme comes into play.
void update();
};
परेशानी यह है कि, कुल डेटा उपयोग को मृदु सीमा के आसपास / उसके आस-पास मँडराते रहने के लिए, प्रबंधक को यह निर्धारित करने का स्मार्ट तरीका रखना होगा कि किन वस्तुओं को उतारना है।
मैं किसी प्रकार की प्राथमिकता प्रणाली का उपयोग करने के बारे में सोच रहा हूं, (जैसे। अस्थाई प्राथमिकता, अक्सर उपयोग की जाने वाली प्राथमिकता, स्थायी प्राथमिकता), अंतिम विचलन के समय और संसाधन के आकार के साथ संयुक्त, यह निर्धारित करने के लिए कि इसे कब निकालना है। लेकिन मैं उपयोग करने के लिए एक अच्छी योजना या सही डेटा-संरचनाओं के बारे में नहीं सोच सकता जो उन्हें जल्दी से प्रबंधित करने के लिए आवश्यक हैं।
क्या इस तरह की व्यवस्था लागू करने वाला कोई व्यक्ति अपने काम करने के तरीके का अवलोकन कर सकता है। वहाँ एक स्पष्ट डिजाइन पैटर्न मैं बाहर याद आ रही है? क्या मैंने इसे बहुत जटिल बना दिया है? आदर्श रूप से मुझे एक कुशल, और कठिन दुर्व्यवहार प्रणाली की आवश्यकता है। कोई विचार?