घटक-आधारित वास्तुकला के लिए एक उपयुक्त स्तर क्या है?


26

मैं एक घटक-आधारित वास्तुकला के साथ एक खेल पर काम कर रहा हूं। एक उदाहरण Entityका एक समूह होता है Component, जिनमें से प्रत्येक में ऐसे उदाहरणों का एक सेट Slotहोता है जिनके साथ मूल्यों को संग्रहीत, भेजना और प्राप्त करना होता है। फैक्ट्री जैसे कार्यPlayer कि आवश्यक घटकों और स्लॉट कनेक्शन के साथ संस्थाओं का उत्पादन करते हैं।

मैं घटकों के लिए ग्रैन्युलैरिटी के सर्वोत्तम स्तर को निर्धारित करने की कोशिश कर रहा हूं। उदाहरण के लिए, अभी Position, Velocityऔर Accelerationसभी अलग-अलग घटक हैं, श्रृंखला में जुड़े हुए हैं। Velocityऔर Accelerationआसानी से एक वर्दी में फिर से लिखा जा सकता है Deltaघटक है, या Position, Velocityहै, और Accelerationके रूप में इस तरह के घटकों के साथ जोड़ा जा सकता है Frictionऔर Gravityएक अखंड मेंPhysics घटक।

क्या एक घटक की सबसे छोटी जिम्मेदारी संभव है (बहुत अधिक अंतर-निर्भरता की कीमत पर) या संबंधित घटकों को अखंड लोगों (लचीलेपन की लागत पर) में जोड़ा जाना चाहिए? मैं पूर्व की ओर झुक रहा हूं, लेकिन मैं दूसरी राय का उपयोग कर सकता हूं।


इसी तरह के सवाल: gamedev.stackexchange.com/questions/4914/…
Den

क्या आप अपने स्वयं के भौतिकी इंजन का उपयोग करने जा रहे हैं या किसी मौजूदा को एकीकृत कर रहे हैं?
डेन

@ पता: मैं कुछ भौतिकी कोड लिख रहा हूं , लेकिन यह किसी भी तरह से इंजन नहीं है। बस सांसारिक 2 डी किनेमैटिक्स।
जॉन पुरडी

जवाबों:


14

पूर्ण ग्रैन्युलैरिटी के बीच एक रेखा होती है, जिससे कोई कोड अपव्यय या बूँद-जैसी अवस्था नहीं होती (यही कारण है कि घटक आर्किटेक्चर इष्ट हैं), और प्रयोज्य।

जाहिर है कि चीजें हो सकती हैं Position, लेकिन वे जरूरी गतिशील नहीं हैं (इसलिए क्यों Velocityऔर Acceleration?)। हालांकि, एक के साथ कुछ Velocityएक चलती वस्तु होने वाली है, इसलिए यह भी समझ में आता है कि Accelerationसमूहीकृत है।

क्या आपके पास एक ऐसा मामला है जहां v और a की आवश्यकता होने वाली है, लेकिन आप उनके लिए भौतिकी सिमुलेशन नहीं चाहते हैं? इसी तरह, वहाँ एक बिंदु होने जा रहा है Gravityअगर वे भौतिक वस्तुओं नहीं हैं?

tl; डॉ। समूह जो समझ में आता है।


1
उचित लगता है। मेरे प्रणाली बहुत कम केंद्रीकरण है: अगर एक Entityएक है Positionऔर कुछ घटक है कि है कि Positionभौतिक विज्ञान में भाग लेने के लिए, तो Entityहै वास्तविक भौतिक। मुझे लगता है कि मैं जो कर सकता हूं वह सिर्फ लॉजिकल ग्रुपिंग के लिए कुछ घटकों को जोड़ना है, और सभी मूलभूत घटकों को एक जिम्मेदारी के लिए रखना है। तो जोड़ने, कहते हैं, एक Movableकरने के लिए एक Entityही , और Position, जोड़ने के रूप में एक ही प्रभाव होगा । VelocityAcceleration
जॉन पूर्डी

6

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

तो एक तेज़ उदाहरण के लिए आपके पास गेम है। खेल पर्यावरण + राज्य में विभाजित होता है। StaticWorld + MoveStuff में पर्यावरण विभाजित होता है। राज्य AIControlled + PlayerControlled में विभाजित होता है। डैमेज का सकल विचार TakesDamage + GivesDamage में विभाजित होता है।

और इसी तरह।

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


मैं कोई नया डेवलपर नहीं हूं। अगर मेरे पास व्यवहार के बजाय अवधारणाओं पर आधारित घटक हैं (यानी, ऊपर-नीचे बनाम नीचे-ऊपर), तो क्या मेरा आर्किटेक्चर अधिक भंगुर नहीं होगा, और अधिक विस्तृत होगा? मैं छोटे घटकों से किसी भी व्यवहार को लागू कर सकता हूं, लेकिन मैं हमेशा पूर्व-निर्धारित लोगों से वांछित व्यवहार प्राप्त नहीं कर सकता। यह उल्लेख नहीं करने के लिए कि मैं एक खेल के संदर्भ में भी जो कुछ भी हासिल करना चाहता हूं, उसकी भविष्यवाणी नहीं कर सकता।
जॉन पुरडी

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

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

4

मेरा अनुमान उन घटकों को संयोजित करना होगा, जिनमें बहुत अधिक सहभागिता होगी। आपके मामले में, मैं एक एकल घटक में स्थिति रखूँगा, और भौतिकी घटक में वेग और त्वरण को एक साथ रखा जाएगा।

लेकिन यह बहुत कुछ इस बात पर निर्भर करता है कि आपके गेम के फीचर्स क्या हैं (जब तक आप किसी खास गेम को ध्यान में रखकर कोई फ्रेमवर्क नहीं बना रहे हैं)।


2
बहुत अधिक सहभागिता के साथ घटकों के संयोजन के साथ समस्या यह है कि कभी-कभी दूसरे भाग की आवश्यकता नहीं होती है।
कम्युनिस्ट डक

4

मुझे लगता है कि यह एक पुराना प्रश्न है लेकिन शायद किसी को यह उत्तर उपयोगी लगेगा।

मेरा मानना ​​है कि Systems अवयवों के निर्माण के तरीके को समझने में बेहतर मदद मिलेगी। सिस्टम उन आर्किटेक्चर में मौजूद हैं जहां घटकों में अपना तर्क नहीं होता है, सरल गेटर / सेटर और हेल्पर कार्यों से अलग होता है। सिस्टम इकाईयों पर काम करते हैं जो घटक आवश्यकताओं को पूरा करते हैं। यही कारण है कि घटक डेटा को अलग करना सबसे अच्छा है क्योंकि यह उस डेटा को दूसरे डेटा के बिना संसाधित करने के लिए समझ में आता है।

उदाहरण के लिए, आपके पास उनके आधार पर MovementSystemइसकी Entities 'को अपडेट करने वाला हो सकता है । यह खेल में सरल संस्थाओं के लिए हो सकता है। लेकिन, प्लेयर और दुश्मनों के लिए, आप वह आंदोलन चाहते हैं जो कि संसाधित हो । लेकिन बाधाओं के लिए आप चाहते हो सकता है । भू-भाग भी घर्षण हो सकता है, लेकिन यह एक वेग घटक नहीं होगा। लेकिन इससे क्या ? बस इसे प्लेयर, शत्रु और बाधा में जोड़ें, और इसे बनाने के लिए एक प्रक्रिया करें।PositionVelocityAccelerationAcceleratedMovementSystemFrictionGravityGravitySystem

लब्बोलुआब यह है कि अधिक है decoupled अपने Componentsकर रहे हैं, और अधिक विस्तृतEntities का उपयोग करते समय हो जाएगा Systems

संपादित करें: अंतिम विवरण को स्पष्ट किया।

संपादित करें: ठीक है, मैं अपने सिस्टम पर काम कर रहा हूं और इस अहसास के लिए आया हूं। स्थिति और वेग को विभाजित करने के लिए एक उदाहरण यह है कि वेग में हेरफेर करने से स्थिति एक मूवमेंट सिस्टम के साथ बदल जाती है। परिणामस्वरूप, एक 'InputMovementSystem' को उपयोगकर्ता इनपुट से प्लेयर को स्थानांतरित करने के लिए स्थिति की आवश्यकता नहीं होती है क्योंकि MovementSystem स्थिति पर लागू होने के लिए वेग में परिवर्तन उठाएगा। दी, यह अभी भी उन्हें एक साथ रखने के लिए ठीक काम करेगा, लेकिन इसका एक उदाहरण है कि ऐसा करने की आवश्यकता क्यों नहीं है।


मैंने हाल ही में एक ब्लॉग पोस्ट पढ़ी जिसमें कुछ इस तरह से कहा गया है:

"यदि आपके पास डेटा है जिसे 2 अलग-अलग घटकों के साथ समूहीकृत किया जा सकता है, तो उस डेटा के साथ तीसरा घटक बनाना सबसे अच्छा है।"

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