क्या डोमेन ड्रिवेन डिज़ाइन गेम के लिए अच्छा है?


10

मैंने अभी-अभी डोमेन मॉडल के बारे में पढ़ा है और जब से मैंने एक ऐसा खेल विकसित किया है जिसमें एक वर्ग है जो केवल डेटा (कुछ व्यवहार / तरीके) रखता है। मैंने इन कक्षाओं को प्रबंधकों को सौंपने का काम सौंपा ... और अब मेरा प्रबंधक एक ईश्वर वस्तु की तरह प्रतीत होता है। मेरा गेम ऑब्जेक्ट जो तर्क को संभालने वाला है, वह केवल एक एनीमिक डोमेन मॉडल है।

मेरा वर्तमान डिजाइन पैटर्न सिंगलटन में है और मैं इस सामान को बाहर निकालने के लिए कुछ पुनरावृत्ति करना चाहता हूं। मैंने कभी भी गेम पर डीडीडी नहीं देखा है (अब तक) लेकिन क्या यह एक अच्छा तरीका है? मैं सिर्फ नौसिखिया प्रोग्रामर हूं (खेल के लिए इच्छुक नहीं) इसलिए मैं अच्छे आर्किटेक्चर के बारे में अधिक सीखना चाहता हूं क्योंकि खेल को फिर से तैयार करने के लिए बहुत फूला हुआ है।


2
मैं कह सकता हूं कि खेलों के लिए एक लोकप्रिय डिजाइन एक घटक वास्तुकला है। एक नया डिज़ाइन जो गेम इंजनों के रक्तस्राव के किनारे पर कुछ नाटक कर रहा है, डेटा ओरिएंटेड डिज़ाइन है (इसका मतलब है कि डेटा को स्मृति में कैसे रखा गया है, वास्तव में उच्चतम डिज़ाइन चिंता है)। लेकिन मैं वीडियो गेम में Domain Driven Design से बात नहीं कर सकता .. इसलिए इसलिए, सिर्फ एक टिप्पणी।
जेम्स

खेल व्यावसायिक अनुप्रयोग नहीं हैं। एक व्यावसायिक अनुप्रयोग (DDD / CQRS) में ध्वनि वास्तुकला निश्चित रूप से एक खेल में ध्वनि नहीं है, और वीजा-वर्सा है। डेकोरेटर मॉडल, या घटक मॉडल पर शोध क्यों नहीं किया जाता है? वे खेल के लिए "अच्छे" हैं और आपकी सिंगलटन समस्या को कम कर देंगे - यहां तक ​​कि यह कहने में भी, कि एकल खेल में आमतौर पर ठीक हैं; खासकर अगर आप इंडी डेवलपमेंट कर रहे हैं। कुछ खत्म करने पर ध्यान लगाओ, वरना तुम मेरी तरह एक बेहतरीन आर्किटेक्चर के साथ मैदान में उतरोगे, लेकिन कोई खेल नहीं।
जोनाथन डिकिंसन

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

जवाबों:


12

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

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

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

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

एनीमिक कक्षाएं और प्रबंधक ऑब्जेक्ट होने के आपके मुद्दे के बारे में, यह आमतौर पर कुछ ऐसा होता है जो परिचयात्मक ऑब्जेक्ट ओरिएंटेशन सबक में कवर किया जाता है और वास्तव में आपको इसे 'ठीक' करने के लिए किसी विशेष पद्धति का पालन करने की आवश्यकता नहीं होती है। (यदि आप अभी शुरुआत कर रहे हैं, तो आप ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग पर एक पुस्तक चुन सकते हैं।) एक वर्ग राज्य और व्यवहार का एक युग्मन है, जहाँ व्यवहार उस अवस्था को संशोधित करता है, और इसे एनकैप्सुलेशन कहा जाता है। आम तौर पर आप जितना संभव हो उतना प्रयास करते हैं और एनकैप्सुलेट करते हैं, जिसका अर्थ है कि राज्य को स्वयं वस्तु (और केवल उस वस्तु) द्वारा हेरफेर किया जाना चाहिए। केवल उस व्यवहार के लिए जिसे कक्षा के भीतर मॉडल नहीं किया जा सकता है, क्या आप एक बाहरी वर्ग को सौंपेंगे, जैसे कि प्रबंधक, यही वजह है कि प्रबंधक कक्षाओं के अस्तित्व को अक्सर खराब-लिखित वस्तु-उन्मुख कोड का संकेत माना जाता है।

मेरा वर्तमान डिजाइन पैटर्न सिंगलटन में है और मैं इस सामान को बाहर निकालने के लिए कुछ पुनरावृत्ति करना चाहता हूं।

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


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

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

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

'सही' खोज क्या है? प्रबंधक कैसे जानता है कि क्या सही है? मेरा अनुमान है कि इस तरह के निर्णय लेने वाले तर्क उन्हें बनाने के लिए अन्य वस्तुओं पर आकर्षित करते हैं, और वे अन्य वस्तुएँ इस कार्यक्षमता के लिए बेहतर उम्मीदवार हैं।
काइलोटन

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

6

मिसाल

जब तक यह उत्तर लिखा गया था, तब तक यहां अन्य पोस्ट किए गए उत्तर सभी गलत हैं।

यह पूछने के बजाय कि गेम के लिए डोमेन-ड्रिवेन डिज़ाइन अच्छा है या नहीं। आपको पूछना चाहिए कि "डोमेन मॉडलिंग" खेलों के लिए अच्छा है या नहीं।

क्या डोमेन मॉडलिंग खेलों के लिए अच्छा है?

जवाब है: कभी-कभी यह बिल्कुल शानदार है। हालाँकि, यदि आप एक वास्तविक समय के खेल जैसे कि एक platformer या FPS या जो भी (कई प्रकार के खेल) बना रहे हैं, तो नहीं। यह जरूरी नहीं कि उन प्रणालियों के लिए अच्छी तरह से अनुकूल हो। हालाँकि, इस प्रणाली के भीतर वे खेल हो सकते हैं जिनमें डोमेन मॉडल पैटर्न को लागू करना प्रभावी है।

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

सभी सॉफ़्टवेयर आपके द्वारा बनाए जा रहे सॉफ़्टवेयर का नहीं है। कुछ दूसरों से काफी अलग हैं।

डोमेन के कुछ उदाहरण जिनमें डोमेन मॉडलिंग अच्छी तरह से काम करता है, कार्ड गेम, बोर्ड गेम और अन्य प्रकार के सिस्टम हैं जो इवेंट-चालित हैं।

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

हालाँकि, जैसा कि चीजें जटिल हो जाती हैं, आप कुछ प्रकार के व्यवहार और गणना को संभालने के लिए डेवलपर्स को अपनी संस्थाओं के भीतर डोमेन मॉडल को लागू करना शुरू करते हैं।

गेम आर्किटेक्चर में डोमेन मॉडल पैटर्न

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

हालाँकि, अधिक ईवेंट-चालित गेम में, यह अधिक संभावना है कि घटक-इकाई ढांचे की भूमिका उपयोगकर्ता इंटरफ़ेस के रूप में मौजूद है। आप एक स्तरित वास्तुकला के साथ समाप्त होते हैं।

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

UI> सेवा परत> डोमेन मॉडल

संक्षेप में, एक सेवा परत कार्यान्वयन के साथ मॉडल-दृश्य-नियंत्रक के साथ अंत।

इस वास्तुकला का उपयोग करते हुए, आपके पास एक पूरी तरह से इकाई-परीक्षण योग्य गेम कोर (गेम डेवलपमेंट कल्चर में एक दुर्लभता, और यह एक इवेंट-संचालित इंटरफ़ेस के साथ दिखाता है)।

ठीक है अब, DDD क्या है?

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

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


1
अंतर्दृष्टि के लिए धन्यवाद। मुझे यह पता लगा कि शायद 3 या 4 साल पहले। मैं तब (5 साल पहले) भोली थी, क्योंकि मैं हमेशा अपनी सभी समस्याओं के लिए "डिजाइन पैटर्न" फिट करने की कोशिश करती हूं। इन "पैटर्न" और वास्तुकला को सीखने में मदद मिली क्योंकि इसने मुझे और विकल्प दिए। मैं हमेशा अपने कोड के हिस्सों को "बस पर्याप्त" करने के लिए छड़ी करता हूं ताकि यह डिजाइनरों (बहुत महत्वपूर्ण), इकाई परीक्षण और भविष्य के यांत्रिकी के लिए आसान हो। वास्तुकला पर काबू पाने के साथ काम करना मुश्किल हो गया और मैंने सीखा कि कठिन रास्ता। अभी मैंने कोडिंग की अपनी शैली को फिट करने के लिए पहले से ही घटक-आधारित वास्तुकला का लाभ उठाया है। ठोस पैर।
सिल्फ़ेड

3

नहीं, मुझे नहीं लगता कि डीडीडी, या कोई अन्य "बुलबॉर्ड" वास्तुकला वास्तव में खेलों के लिए अच्छा है। "घटक प्रणाली" के संभावित अपवाद के साथ, जो वास्तव में यहां लोकप्रिय लगता है।

जब मैं इस तरह के सवाल और चर्चा सुनता हूं, तो मुझे इस साइट की याद आ जाती है । अलग-अलग आर्किटेक्चर के buzzwords को टटोलना आमतौर पर आपको वास्तव में डिज़ाइन करने और अपने स्वयं के एप्लिकेशन को कोड करने से कम अच्छा लगता है।


1
+1 के लिए "वास्तव में अपने स्वयं के आवेदन को डिजाइन करना और कोड करना।" वे पैटर्न मेरे लिए दिशा-निर्देश और विचार उत्तेजक हैं - इससे ज्यादा कुछ नहीं। एक समस्या को बदलना ताकि यह एक समाधान में फिट हो जाए, यह गलत काम है।
जोनाथन डिकिंसन

-1

हां, लेकिन आपको अनुकूलित होना चाहिए।

DDD का उपयोग करते समय आपको प्रत्येक डोमेन की प्रतिरूपकता और एकल जिम्मेदारी मिलेगी। लेकिन कुछ और सिर्फ चीजों को जटिल बनाते हैं।

मेरा जवाब यहां देखें


आप अपने उत्तर को थोड़ा विस्तारित करना चाहते हैं (उत्तर के मुख्य भाग को कवर करें), क्योंकि अभी यह एक लिंक केवल उत्तर है (भले ही यह किसी अन्य स्टैक एक्सचेंज साइट को इंगित करता है)।
वेलनकोर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.