एक खेल की दुनिया के भीतर बड़ी मात्रा में संस्थाओं का अनुकरण करने का सुरुचिपूर्ण तरीका


33

मान लें कि आपके पास एक गेम है जिसमें कुछ कार्यों की सेवा देने वाली कई (कई) इकाइयां हैं, जिनमें से सभी को लगातार जरूरत नहीं है या हर फ्रेम में विचार करने की आवश्यकता है। मैं जिस ठोस समस्या पर काम कर रहा हूं, उसमें यह मुद्दा मौजूद है, जिसमें शरीर का एक विस्तृत अनुकरण है, जिसमें उसके अंग भी शामिल हैं।

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

मैं जो लेकर आया था वह कम से कम ठीक समाधान जैसा लगता है। यह एक सरल कतार / स्टैक बनाता है (आवश्यक यह है कि प्रत्येक तत्व को पढ़ते ही हटा दिया जाता है; आदेश अप्रासंगिक है) "ध्यान स्टैक" कहा जाता है जहां वस्तुओं को सिम्युलेटेड रहने की आवश्यकता होती है। जिन वस्तुओं पर ध्यान देने की आवश्यकता होती है, वे बस खुद को स्टैक पर रख देती हैं या अन्य वस्तुओं द्वारा वहां डाल दी जाती हैं। ये वस्तुएं शायद एक सरल इंटरफ़ेस को अनुकरण () - फ़ंक्शन के साथ कार्यान्वित करेंगी।

मेरे पिछले पाचन उदाहरण पर लागू इसका मतलब यह होगा:

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

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

अब, मैं ईमानदारी से नहीं जानता कि क्या यह अनुभव की कमी के कारण इस समस्या के सुरुचिपूर्ण समाधान के करीब है। क्या मैं प्रयोग करने योग्य कुछ के करीब हूं? यह आमतौर पर कैसे किया जाता है या किसी के पास कोई सुझाव या बेहतर समाधान है?

जवाबों:


10

यह ठीक उसी तरह है जैसे हमने स्टेंडल में इस समस्या को हल किया था । हमारे मामले में बहुत सारी चीजें हैं जो समय-समय पर होती हैं, लेकिन हर मोड़ पर नहीं: हीलिंग मंत्र, पौधे थोड़ा आगे बढ़ रहे हैं, अध: पतन हो रहे हैं, जमीन पर आइटम समाप्त हो रहे हैं।

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


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

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

14

इनपुट के समान समस्या की तरह लगता है: आपके पास कीबोर्ड पर 100+ कुंजियाँ हैं, लेकिन हर फ्रेम पर प्रत्येक व्यक्ति की कुंजी की जांच नहीं करना चाहते हैं, तो आप क्या करते हैं?

दो उत्तर: मतदान या सिस्टम संदेश।

किसी भी बिंदु पर मतदान = जब यह वास्तव में गेम में मायने रखेगा, कीबोर्ड की स्थिति (या ऑब्जेक्ट, आपके मामले में) की क्वेरी करें। बाकी समय, उन्हें अनदेखा करें।

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


10

इसलिए मैं कार्यान्वयन से एक कदम पीछे हटने जा रहा हूं और एक डिजाइन परिप्रेक्ष्य से प्रश्न की समीक्षा कर रहा हूं। क्या आपके पास इस सिमुलेशन में शामिल किए गए सभी विवरण प्रदर्शित करने के लिए एक ठोस योजना है?

उदाहरण के लिए:

  • क्या खिलाड़ी खाली पेट और एक पूर्ण के साथ एक जानवर के बीच अंतर बता सकता है?
  • क्या यह जानकारी उनके लिए किसी भी तरह से मायने रखती है, जब वे आपके खेल के भीतर बातचीत विकल्प बना रहे हों?
  • क्या जानवर को देखने वाला खिलाड़ी लगातार आपके नकली घटनाओं के परिणाम की भविष्यवाणी कर सकता है, या एक यादृच्छिक संख्या पर्याप्त होगी?

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

व्यवहार अनुकरण काम करने का एक टन है, लेकिन हमेशा अंतिम उपयोगकर्ताओं के अनुभव को ध्यान में रखें।


हाँ खिलाड़ी अंतर बताने में सक्षम होगा और गेमप्ले पर इसके कुछ प्रभाव हैं, लेकिन यह इस समय मज़ेदार है। बौने किले में घाव प्रणाली की तरह, जो बहुत विस्तृत लेकिन नगण्य है। लेकिन जैसा कि आपने पहले ही उल्लेख किया है कि इस पर काम करना बहुत मजेदार है और यह मेरा मुख्य ध्यान अभी है।
मार्क मुलर

9

मुझे एक ऐसी समस्या थी जिसमें मैंने कुछ साल पहले काम किया था - वस्तुओं का अनुकरण जटिल था और वास्तव में दुनिया की प्रत्येक वस्तु पर विस्तार से प्रदर्शन नहीं किया जा सकता था।

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


2

एक अनुसूची के साथ समाधान अच्छा है। ध्यान दें कि प्रत्येक इकाई को अपने भविष्य के कार्यों के लिए संकेतकर्ताओं की एक सूची होनी चाहिए, जो यदि आवश्यक हो तो भविष्य के कार्यों को अमान्य करने की संभावना देता है। अर्थात। सोते हुए जानवर हमला करने पर तुरंत जाग जाते हैं, इसलिए आपको भविष्य में इसके जागने की कार्रवाई को अमान्य करना होगा।


1

इसके लिए एक डिज़ाइन पैटर्न है। मुझे लगता है कि इसे डेटाबेस ऑब्जेक्ट कहा जाता है?

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

वही एनिमेशन के लिए जाता है। यदि यह एक निष्क्रिय एनीमेशन या घटना है जो हर उदाहरण के लिए सामान्य है, तो यह टेम्पलेट उदाहरण में निवास कर सकता है, जहाँ अधिक विशिष्ट एनिमेशन अलग से निर्धारित किए जा सकते हैं।

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

यह एनीमेशन के लिए एक प्रतिनिधि का उपयोग करने के लिए प्रकृति में समान है।


3
फ्लाईवेट पैटर्न, क्या आपका मतलब है?
17

0

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


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

प्रति राज्य कई चीजें हो सकती हैं, क्योंकि आप सभी सक्रिय अंगों को एक राज्य पर संग्रहीत करते हैं और प्रत्येक एक फ्रेम को निष्पादित करते हैं। आपके सिमुलेशन में बहुत कुछ होता है, हालांकि राज्य के बदलाव के साथ फिट होता है। जैसे- चबाना -> खोदना। लेकिन मुझे लगता है कि आप सही हैं कि एक जानवर के पास केवल एक राज्य नहीं हो सकता है। पाचन तंत्र में होने वाले राज्य संक्रमण से असंबंधित अंगों के साथ कहे जाने वाले राज्य संक्रमण हैं। लेकिन शायद यह अधिक जटिल है कि आपके पास क्या है। बस सोचा कि यह कुछ विचार करने के लिए हो सकता है।
एरिक इंगहेम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.