इकाई घटक प्रणाली - किसी वस्तु के रूपांतरण को कैसे लागू किया जाए?


11

अपने इंजन के लिए एक इकाई-घटक प्रणाली को डिजाइन करने में, मैं एक विशेष प्रकार के घटक को संग्रहीत करने और पुनः प्राप्त करने के तरीके में थोड़ा रोड़ा बना हूं।

सबसे पहले, मुझे इस प्रश्न में स्पष्ट शब्दावली का एक सा सेट करने दें:

  • मैं एक डेटा संरचना को " घटक " कहता हूं जो किसी विशेष सिस्टम के लिए प्रासंगिक डेटा संग्रहीत करता है।
  • मैं " सिस्टम " को उन विधियों और डेटा संरचनाओं का एकत्रीकरण कहता हूं जो उपयोगकर्ता के साथ गेम स्टेट / इंटरफ़ेस को अपडेट करने के लिए घटकों का उपयोग करता है।
  • एक " इकाई " मूल रूप से एक आईडी है जिसका उपयोग विशिष्ट घटकों को प्राप्त करने और गेम लॉजिक में उनके डेटा को संशोधित करने के लिए किया जाता है।

प्रत्येक प्रणाली अपने प्रकार के घटक (जैसे फिजिक्स-> PhysicsComponent, AI-> AIComponent, Rendering-> RenderingComponent) के एक (ID-mapped) सरणी का मालिक है, ताकि वह डेटा पर कुशलता से काम कर सके।

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

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

क्या इस समस्या को हल करने का एक उचित तरीका है? क्या ट्रांसफ़ॉर्म भी एक घटक होना चाहिए?


3
के लिए +1 : "सबसे पहले, चलो मुझे शब्दावली मैं इस सवाल में उपयोग के लिए जा रहा हूँ का एक सा स्पष्ट सेट"
Vaillancourt

मैं इस साइट में इस प्रकार के प्रश्नों को देखना ज्यादा पसंद करूंगा। +1
एस। तारिक inetin

बस सभी घटकों को वैश्विक चर के रूप में संग्रहीत करें
मील्स राउत

जवाबों:


2

यह काफी व्यापक प्रश्न है, जिसका उत्तर, दृढ़ता से आपकी वास्तुकला पर निर्भर करता है। हालांकि, मैं आपको एक सामान्य उत्तर देने का प्रयास करूंगा।

आपकी भौतिकी और प्रतिपादन प्रणाली को निश्चित रूप से परिवर्तन की आवश्यकता होगी, हालाँकि, AI सिस्टम नहीं होगा। इसलिए, यह समझ में आता है कि यह स्वयं के घटक वर्ग में परिवर्तन को संक्षिप्त कर सकता है। इस तरह के सभी इच्छुक सिस्टम एक ही डेटा का उपयोग करेंगे, इसलिए, यह इकाई के लिए ट्रांसफॉर्म ऑब्जेक्ट के लिए एक पॉइंटर, या एक ट्रांसफॉर्म ऑब्जेक्ट के लिए एक आईडी है जो कहीं और संग्रहीत होता है।

यदि आप बाद वाले समाधान का चयन करते हैं, तो प्रत्येक सिस्टम जो एक ट्रांसफॉर्म में रुचि रखता है, जहां भी ट्रांसफॉर्म ऑब्जेक्ट को संग्रहीत किया जाता है, वहां तक ​​पहुंच की आवश्यकता होगी।

यदि आप पूर्व को चुनते हैं, तो प्रत्येक सिस्टम को इकाई तक पहुंचने की आवश्यकता है, और परिवर्तन का अनुरोध करें।

पूर्व मामले में, समस्या यह हो जाती है कि ओओपी नियमों को तोड़ने के बिना, प्रत्येक सिस्टम में परिवर्तन के लिए भंडारण की पहुंच कैसे प्रदान की जाए, अगर आप ऐसी चीजों की परवाह करते हैं।

उत्तरार्द्ध मामले में ऐसा कोई मुद्दा नहीं है, लेकिन पॉइंटर्स को स्टोर करने के लिए घटक ऑब्जेक्ट्स के बजाय ऑब्जेक्ट्स को संग्रहीत करने के लिए अपनी इकाई ऑब्जेक्ट डिज़ाइन को बदलना आवश्यक है।

मेरी व्यक्तिगत प्राथमिकता घटक वस्तुओं की ओर संकेत करने के लिए इकाई वर्ग को डिजाइन करना है, क्योंकि यह कई डिजाइन मुद्दों को सरल करता है। इस तरह, प्रत्येक प्रणाली जिसे एक परिवर्तन की आवश्यकता होती है, वह इसे इकाई से अनुरोध कर सकती है, और इसे अनदेखा कर सकती है यदि ऐसा नहीं होता है। हालाँकि, यह इंगित करने के लिए निहित एक कम्प्यूटेशनल उपरि ले जाता है, कि कैश की लागत याद आती है।

इस पर अधिक जानकारी के लिए इस ECS अवलोकन पर एक नज़र है ।

दिन के अंत में, यह तय करना है कि आपके लिए कौन अधिक महत्वपूर्ण है: विकास में आसानी, या प्रदर्शन।

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


आपके सुझाव के लिए धन्यवाद। मेरे पास एक सवाल है, हालांकि: AI सिस्टम को ऑब्जेक्ट की स्थिति की आवश्यकता क्यों नहीं होगी?
CRefice

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

@IYYoung उन्हें अलग करना अच्छे से अधिक नुकसान कर सकता है, संभवतः यदि आपको लगता है कि आपको अलग से स्थिति या अभिविन्यास की तुलना में एक साथ अधिक बार स्थिति और अभिविन्यास की आवश्यकता है। उस स्थिति में, एकल घटक में स्थिति और अभिविन्यास डेटा विशेषताओं को रखने से कैश प्रदर्शन में सुधार हो सकता है।
20

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

@Naros हाँ मेरा यही मतलब है: दो अवयव, रूपांतरण, और (मेरे ढांचे में) SpatialData, जिसमें स्थिति, वेग, अभिविन्यास और कोणीय वेग शामिल हैं। स्थिति और अभिविन्यास का उपयोग ट्रांसफॉर्म के निर्माण और अद्यतन के लिए किया जाता है।
इयान यंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.