क्या मैं इवेंट हैंडलर के साथ पागल हो सकता हूं? क्या मैं अपने डिजाइन के साथ "गलत रास्ता" जा रहा हूं?


12

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

मेरा गेम इंजन वर्तमान में एक पैनिंग ओवरहेड कैमरा के साथ बुनियादी स्प्राइट-आधारित प्रतिपादन करता है। मेरा डिज़ाइन इस तरह दिखता है:

SceneHandler

इसमें उन वर्गों की एक सूची शामिल है जो सीनलेनिस्टनर इंटरफ़ेस (वर्तमान में केवल स्प्राइट्स) को लागू करते हैं। टिक के अनुसार एक बार रेंडर (), और ऑनकैमरा यूपीडेट () भेजता है; SceneListeners को संदेश।

InputHandler

प्रति बार एक बार इनपुट को पोल करता है, और InputListeners को एक सरल "onKeyPressed" संदेश भेजता है। मेरे पास एक Camera InputListener है जो एक SceneHandler उदाहरण रखता है और updateCamera () को ट्रिगर करता है; इनपुट क्या है पर आधारित घटनाएँ।

AgentHandler

टिक के अनुसार किसी भी एजेंट (एआई) पर डिफ़ॉल्ट क्रियाओं को कॉल करता है, और पंजीकृत किसी भी नई घटनाओं के लिए एक स्टैक की जांच करेगा, जो उन्हें आवश्यकतानुसार विशिष्ट एजेंटों को भेज रहा है।

इसलिए मेरे पास बुनियादी स्प्राइट ऑब्जेक्ट हैं जो एक दृश्य के चारों ओर घूम सकते हैं और यात्रा करने के लिए अल्पविकसित स्टीयरिंग व्यवहार का उपयोग कर सकते हैं। मैं टक्कर का पता लगाने पर मिल गया है, और यह वह जगह है जहाँ मुझे यकीन नहीं है कि मेरी डिजाइन अच्छी है। क्या कई, छोटे ईवेंट हैंडलर का होना अच्छा अभ्यास है? मुझे लगता है कि मैं जिस तरह से जा रहा हूं, मुझे लगता है कि मुझे किसी तरह के CollisionHandler को लागू करना होगा।

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

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

जवाबों:


21

इवेंट आधारित डिज़ाइन में ज्यादातर रिएक्टर डिज़ाइन पैटर्न को लागू करना शामिल है ।

डिजाइन घटकों को शुरू करने से पहले आपको इस तरह के पैटर्न की सीमाओं को देखना चाहिए (आपको इस बारे में बहुत जानकारी मिल सकती है)।

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

जब आप हर एप्लिकेशन को एक सभ्य जटिलता के साथ विकसित करते हैं, तो आप जल्दी या बाद में, किसी ऐसे हैंडलर का सामना करेंगे जो एक जटिल काम करता है जिसे समय की आवश्यकता होती है

इन मामलों में आप दो स्थितियों में अंतर कर सकते हैं (जरूरी नहीं कि परस्पर अनन्य):

जटिल घटना-संबंधी जिम्मेदारियाँ और जटिल घटना-असंबद्ध जिम्मेदारियाँ।

जटिल घटना-संबंधी जिम्मेदारियाँ:

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

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

एक अन्य उपाय यह है कि किसी बाहरी संस्था को घटनाओं को आग लगाने के लिए और दूसरों को सदस्यता के लिए जाने दें यदि रुचि है (समय की घटना सबसे सामान्य उदाहरण है जिसे आप सामान्य कर सकते हैं)।

जटिल घटना-असंबंधित जिम्मेदारियां:

दूसरा मामला तब होता है जब किसी घटना के बाद होने वाली कार्रवाई में एक आंतरिक जटिलता होती है: आपको उदाहरण के लिए एक घटना के बाद एक संख्या की गणना करना होगा।

यहाँ रिएक्टर पैटर्न मूल रूप से विफल रहता है , अगले चरण को ट्रिगर करने के लिए समाप्ति पर आग की घटनाओं को थोड़ा हिस्सा में फव्वारा पीढ़ी एल्गोरिथ्म को विभाजित करने के लिए थोड़ा लायक है।

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

इस तरह की स्थितियों को संभालने के लिए, मैंने एक लचीले थ्रेड पूल के ऊपर नौकरी की कतार को अपनाने के लिए उपयोगी पाया ।

एक हैंडलर एक लंबे कार्रवाई शुरू करने के लिए की जरूरत है है, यह समाहित है कि कार्रवाई में एक नौकरी इकाई में काम कतार में रखी जानी है। इस इनकैप्सुलेटेड एक्शन के लिए रिएक्टर थ्रेड में घटनाओं को ट्रिगर करने का एक साधन होना चाहिए । नौकरी कतार प्रबंधक अपने स्वयं के धागे में या रिएक्टर धागे में चला सकता है और "newJob" घटना पर प्रतिक्रिया कर सकता है।

नौकरी कतार प्रबंधक निम्न कार्य करता है:

  • यह अपने शेड्यूल एल्गोरिथ्म का उपयोग करते हुए लचीले थ्रेड पूल से थ्रेड को एक जॉब यूनिट आवंटित करता है यदि पूल एक थ्रेड प्रदान करने में सक्षम है (एक मुफ्त थ्रेड है या एक नया थ्रेड निर्माण की अनुमति है)

  • पूल को यह देखने के लिए देखें कि क्या एक नौकरी इकाई समाप्त हो गई है ताकि एक और लंबित इकाई को निष्पादित करने के लिए एक धागा प्राप्त किया जा सके, यदि कोई हो।

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


3
बहुत गहन होने के लिए +1। उत्सुक पाठक के लिए कुछ लिंक भयानक होंगे।
सैम होसेवर

1

अधिकांश स्थितियों में अन्य विकल्पों पर घटनाओं का उपयोग करने से अक्सर गति और विकेंद्रीकरण में सुधार हो सकता है। मुझे लगता है कि अगर आप इसके लिए बहुत सारी घटनाओं का उपयोग कर सकते हैं तो आपको जाना चाहिए।

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