RTS खेल ऐ धागा


14

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

मुझे पता है कि कैसे प्रोग्राम करना है। मुझे यह भी पता है कि मैं कंप्यूटर खिलाड़ियों के लिए खेल वर्गों और नियम-आधारित (राज्य-मशीन) एआई की संरचना कैसे करूंगा।

मैं Doctrines विकसित करना चाहता हूं, जो एक विशिष्ट इकाई को एक विशिष्ट व्यवहार देगा (लेकिन एक ही समय में कई इकाइयों पर उपयोग किया जा सकता है), जैसे कि स्काउट, मिशन मिशन का पालन करें, स्थिति रखें (किसी भी शत्रु पर हमला करें या अभिभूत हो जाएं) , आदि...

सिद्धांत केवल इकाइयों पर लागू होंगे, इसलिए इसमें एक इकाई परिप्रेक्ष्य होगा, और पूरे मानचित्र पर नहीं पता होगा।

कंप्यूटर एआई पूरे दृश्यमान मानचित्र का विश्लेषण करेगा और यह तय करेगा कि नियमों के एक और सेट के आधार पर प्रत्येक इकाई को असाइन करने के लिए किस सिद्धांत पर।

मैं ओपन # के साथ सी # में ऐसा कर रहा हूं।

अभी के लिए, मेरे पास मुख्य गर्भाधान शुरू करने से पहले मेरे पास बहुत कुछ नहीं है। मेरे पास एक गेम लूप है जहां सभी गेम प्रोसेसिंग (जहां मैं अपडेट मॉवमेंट, मुकाबला, रेंडरिंग आदि कहूंगा, एक के बाद एक) होगा, यह बहुत बार कहा जाता है अगर Application.Idle इवेंट।

अब, मैं सोच रहा था। चूंकि गेमलो में प्रक्रिया करने के लिए बहुत सारी चीजें होंगी, क्या कंप्यूटर एआई और इकाइयों को उस लूप में अपने कार्यों का चयन करना चाहिए या यह बहुत धीमी गति से होगा?

अगर मैं चाहता हूं कि सभी चीजें एक साथ हों, तो क्या मुझे कंप्यूटर AI के लिए एक अलग थ्रेड बनाना चाहिए? या यहां तक ​​कि हर इकाई के लिए एक अलग धागा?

मुझे मल्टी-थ्रेडिंग का ज्यादा अनुभव नहीं है। इसके लिए सबसे अच्छा तरीका क्या होगा?


असंबंधित - OpenGL के बजाय Ogre3D माना जाता है?

दरअसल, नहीं, मैंने इसके बारे में कभी नहीं सुना। मैं ओपनजीएल का उपयोग कर रहा हूं क्योंकि यही मेरी कक्षाओं में पढ़ाया गया था। क्या Ogre3D 2D भी कर सकता है? मुझे लगता है कि यह हो सकता है, लेकिन हम कभी नहीं जानते ...

हाँ, यह भी अपने स्वयं के जीयूआई टूलकिट (सेगुई) कर सकता है। उदाहरण के लिए, टॉर्चलाइट इसके साथ बनाया गया है। यह आपको समय बचा सकता है क्योंकि यह अच्छी तरह से ओपन ओपन लपेटता है। ogre3d.org/tikiwiki/MOGRE

"या यहां तक ​​कि हर इकाई के लिए एक अलग धागा" नं। एक धागे का ओवरहेड बहुत बड़ा है। एक के लिए थ्रेड के स्टैक के लिए आरक्षित मेमोरी (डिफ़ॉल्ट रूप से 1 एमबी) है। और थ्रेड स्विच भी महंगे हैं।

जवाबों:


3

"खरोंच से" क्या मतलब है? क्या आप डायरेक्ट एक्सएक्सएक्स के बजाय एक्सएनए जैसी कुछ का उपयोग कर सकते हैं?

आपको द्रव गति होने के लिए प्रति सेकंड 30 और 60 फ्रेम के बीच कुछ प्रदान करना चाहिए। वास्तव में अधिक एफपीएस की आवश्यकता नहीं है।

अगर प्रतिपादन + तर्क 16ms से कम लेता है जो 60fps आपको देता है, तो एआई थ्रेड की कोई आवश्यकता नहीं होनी चाहिए।

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

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

मुख्य एआई के पास प्रदर्शन करने के लिए और अधिक काम है, क्योंकि इसे मानचित्र पर सभी इकाइयों को संसाधित करना है और एक रणनीति का पता लगाना है, इसलिए इसे अधिकांश गणना समय की आवश्यकता होनी चाहिए। यह एक अलग धागे के लिए पहला उम्मीदवार है।

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

खासकर यदि आपके पास बहुत अधिक अनुभव नहीं है, तो यदि आपके पास नहीं है तो थ्रेडिंग न करें। यह बिना किसी अतिरिक्त बोझ के जटिल होगा। आप मल्टीथ्रेडिंग को एक अलग प्रोजेक्ट के रूप में, या एक के एक विस्तार के रूप में एक बार काम कर रहे राज्य में सीख सकते हैं । सौभाग्य!


0

एअर इंडिया के लिए एक अलग धागा है। लेकिन हर इकाई के लिए नहीं क्योंकि यह बहुत अधिक ओएस संसाधनों का उपभोग करेगा और तुल्यकालन एक बुरा सपना होगा।

सुनिश्चित करें कि AI थ्रेड को निष्पादित करने का अवसर मिलेगा। इसे हल्के में न लें, अगर मुख्य धागा बहुत सारी चीजें करता है, तो यह कभी भी उस अवसर को नहीं पा सकता है! यदि आप केवल AI थ्रेड को उच्च प्राथमिकता देते हैं, तो गेम अप्रतिसादी हो जाता है, जो अस्वीकार्य है।

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


0

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

अन्य इकाइयों को एक अलग थ्रेड में जांचा जाता है, और मेरी दो प्राथमिकताएं हैं: 1. इकाइयां उन स्थानों पर हैं जो उपयोगकर्ता को दिखाई देती हैं यदि वह स्क्रीन को वहां ले जाता है। 2. इकाइयां जो छिपे हुए क्षेत्रों में हैं (अभी तक नहीं पता चला है और "युद्ध का कोहरा")।

सेकंड प्राथमिकता में इकाइयों के लिए, मैं लूप को कम बार चलाता हूं, और आवश्यकता होने पर उन्हें पूर्वव्यापी रूप से स्थानांतरित करके क्षतिपूर्ति करता हूं।


1
बहुत जटिल लगता है।

आपका विचार मुख्य खेल लूप में और बाहर जाने वाली इकाइयों के बारे में पहले भाग को छोड़कर ठीक लगता है। सभी एआई को अपने स्वयं के लूप में किया जाना चाहिए, जहां आप xकम प्राथमिकता वाली इकाइयों पर लूप को छोड़ना चुन सकते हैं ।
ओलहोवस्की

0

आपको मल्टीथ्रेड करने की आवश्यकता है या नहीं, एआई को मल्टीथ्रेड करने के लिए तैयार करना एक अच्छा विचार हो सकता है।

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

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

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

एक माध्यमिक लाभ के रूप में, आप भविष्य में समय के साथ अन्य प्रणालियों से प्राप्त होने वाली जानकारी को सही ज्ञान के बजाय अनिश्चितता का अनुकरण करके कैश का विस्तार कर सकते हैं।

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