एक इकाई आईडी सिस्टम का उपयोग करने के क्या लाभ हैं?


12

मैं वर्तमान में पुस्तक प्रोग्रामिंग गेम AI बाय उदाहरण पढ़ रहा हूं।

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

कुछ संस्थाओं की आईडी संख्या भी फाइल की जा सकती है जिसमें कुछ संस्थाओं की आईडी (मुख्य खेल वर्ण) शामिल हैं।

मेरा सवाल है: मैं ऐसा क्यों करूंगा? मैं संदर्भों के साथ सीधे काम क्यों नहीं कर सकता? क्या कभी-कभी प्रत्यक्ष संदर्भ प्राप्त करना मुश्किल होता है? क्या एक आईडी प्रणाली का उपयोग एक सामान्य दृष्टिकोण है? क्या ऐसे खेल हैं जो आईडी का उपयोग नहीं करते हैं?

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

जवाबों:


18

संदर्भ कई स्थितियों के लिए अच्छी तरह से काम करते हैं। हालांकि, तीन महत्वपूर्ण परिस्थितियां हैं जिनमें संदर्भ अच्छी तरह से काम नहीं करेंगे:

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

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


2
अंतिम पैराग्राफ अपने स्वयं के (स्मृति प्रबंधन) का एक बुलेट बिंदु होना चाहिए। ऐसी परिस्थितियां हैं जहां एक वर्ग को कुछ समय के लिए किसी अन्य इकाई के संदर्भ की आवश्यकता होती है, लेकिन इकाई संदर्भ अमान्य हो सकता है (यानी प्रक्षेप्य लक्ष्य इकाई की मृत्यु हो गई)। NULL को वापस करके जब ID द्वारा प्रत्येक इकाई का अनुरोध किया जाता है, तो इकाई संदर्भ अमान्य हो जाने पर सही काम करने (दुर्घटनाग्रस्त होने के बजाय) करने की जिम्मेदारी लेता है।
LearnCocos2D

जवाब के लिए धन्यवाद। स्पष्ट करने का प्रश्न। सामान्य तौर पर: जिन स्थितियों में इकाई A को इकाई B का संदर्भ प्राप्त करने की आवश्यकता होती है (उस पर हमला करने के लिए, उसे एक संदेश भेजें, उसके साथ टकराव की जांच करें, या किसी अन्य कारण से) - क्या मुझे आईडी प्रणाली का उपयोग करना चाहिए इसे प्राप्त करें, या सीधे संदर्भ प्राप्त करना कभी-कभी ठीक है? अर्थ: क्या इकाई को हमेशा इकाई बी (जो क्रॉस-संदर्भ इकाई-संदर्भ और आईडी नंबर) की आईडी भेजकर EntityManager से संदर्भ प्राप्त करना चाहिए, और केवल EntityManager से संदर्भ का उपयोग करके इकाई B से संपर्क करें? क्या मुझे हमेशा आईडी सिस्टम का उपयोग करना चाहिए?
अविव कोहन

या कभी-कभी सीधे संदर्भ प्राप्त करना ठीक होता है? दूसरे शब्दों में, मुझे कब ए एंटिटी मैनजर का उपयोग करना चाहिए, इसके अंदर संग्रहीत संदर्भ को प्राप्त करने के लिए, और जब ए के पास बी का संदर्भ हो सकता है जो भी इसका मतलब है?
अविव कोहन

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

समझा। मुझे यह देखने के लिए एक उदाहरण का उपयोग करने दें कि क्या मैं समझता हूं कि आपका क्या मतलब है। मान लीजिए कि मैं टकराव का पता लगाने के लिए एक समान ग्रिड का उपयोग कर रहा हूं। ग्रिड एक 2d सरणी है। ग्रिड में एक ही 'सेल' में संस्थाओं के साथ टकराव के लिए प्रत्येक इकाई की जाँच की जाती है। "नियमित" दृष्टिकोण का उपयोग करते हुए, प्रत्येक सेल उस क्षेत्र में GameEntity ऑब्जेक्ट्स के संदर्भों को धारण करेगा जो यह प्रतिनिधित्व करता है। "आईडी सिस्टम" दृष्टिकोण का उपयोग करते हुए, प्रत्येक सेल संस्थाओं की आईडी संख्या धारण करेगा। टकराव का पता लगाने के लिए ठोस संदर्भ प्राप्त करने के लिए इन नंबरों को EntityManager को भेजा जाएगा। क्या यह अच्छी समझ है?
अवीव कोहन

2

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

आईडी 5067 अंक 0x8765 प्राणी को संबोधित करता है और दूसरा जीव नया जीव बन जाता है। आईडी 5067 के लिए किसी व्यक्ति की पहचान 7073 पर है, यह 0x8765 की ओर इशारा करता है, लेकिन यह प्राणी अब आईडी 7073 के साथ पंजीकृत है, इसलिए इकाई आईडी डेटाबेस आपको पता है कि आपने एक अप्रचलित आईडी का उपयोग किया है और आपको सूचित करता है, जिस प्राणी तक आपने पहुँचने की कोशिश की है, वह अब सक्रिय नहीं है।

उस और सभी अद्भुत कारणों के लिए बाइटे56 का उल्लेख किया गया है कि यह सीधे संदर्भों का उपयोग करने से बचने के लिए एक अच्छा डिज़ाइन क्यों है।

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