2014-09-01 9 views
5

मैं एक ओपन-वर्ल्ड सिंगल-प्लेयर आरपीजी बना रहा हूं जिसमें दुनिया ज्यादातर अलग-अलग क्षेत्रों से बना है, जो स्केलेबिलिटी के लिए खंडों में विभाजित हैं। दुनिया में ऐसे प्राणी होते हैं जो एक दूसरे के साथ बातचीत करते हैं। अधिकांश प्राणियों में अन्य प्राणियों के संदर्भ होंगे, संभवतः अन्य क्षेत्रों में प्राणियों सहित। being के लिए वर्ग ऐसाखेल की दुनिया में अनलोड किए गए ऑब्जेक्ट्स के संदर्भों को संग्रहीत करना और पुनर्प्राप्त करना

class Being { 
    weak_ptr<Being> target; 
    // other members 
}; 

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

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

क्या इन विकल्पों के बेहतर विकल्प हैं? मुझे कल्पना है कि यह एक आम समस्या है, लेकिन मैं SO पर संबंधित प्रश्न नहीं ढूंढ पा रहा हूं।

+0

आपका दृष्टिकोण वास्तव में वस्तुओं की कैशिंग है। आप यहां एक नजर डाल सकते हैं: http://stackoverflow.com/questions/17807805/how-to-cache-1000s-of-large-c-objects मुख्य प्रश्न यह है कि वस्तुओं को लोड करने के लिए इसे कैसे कुशल बनाना है, क्योंकि यह उनकी स्थिति पर निर्भर करता है न कि उनकी आईडी पर। – Christophe

उत्तर

1

आप ऐसा करने में आपकी सहायता के लिए Flyweight Pattern जैसे कुछ उपयोग कर सकते हैं। फिर प्रत्येक प्रकार का अस्तित्व वास्तव में केवल एक बार लोड होता है (जिसे आलसी रूप से उनकी आवश्यकता होती है), और फिर प्रत्येक होने के उदाहरण में केवल स्थिति-विशिष्ट चर जैसे स्थिति, गति इत्यादि शामिल हैं

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

+0

दुर्भाग्य से, मुझे नहीं लगता कि फ्लाईवेट पैटर्न मुझे बहुत बचत देगा क्योंकि प्राणियों में ज्यादातर "बाहरी" डेटा होता है (जैसे आंकड़ों की एक लंबी सूची, सूची, आदि)। दूसरा दृष्टिकोण दिलचस्प लगता है। क्या यह मेरे विचार संख्या के समान है। 2? यदि नहीं, तो क्या आप मुझे उस दृष्टिकोण के उदाहरण से जोड़ सकते हैं? धन्यवाद! –

संबंधित मुद्दे