एक MMO खेल में बड़ी संख्या में पिकअप को कैसे संभालना है


26

Minecraft जैसे गेम या वास्तव में कोई भी MMO गेम जिसमें पिकअप हैं, उन्हें कैसे संभालते हैं?

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

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

मेरा वास्तविक सवाल यह है: अन्य MMOs ने इस मुद्दे को कैसे हल किया है?


9
इसके अलावा, Minecraft के संदर्भ में, एक निश्चित संख्या में आइटम एक दूसरे के पास होने के बाद (उसी ब्लॉकस्पेस में एक ही आइटम के 3+), सर्वर 3 उदाहरणों को एक समूहित उदाहरण के साथ बदलता है जिसमें ब्लॉक प्रकार होता है ( minecraft:dirt) और एक गिनती (30), ताकि जब खिलाड़ी इसे लेने के लिए पर्याप्त करीब हो, तो यह खिलाड़ी की इन्वेंट्री में जितना संभव हो उतना गिनती जोड़ सके। यदि खिलाड़ी के पास केवल 6 आइटम के लिए जगह है और 30 का एक स्टैक जमीन पर है, तो खिलाड़ी 6
उठाएगा

6
@Zymus यह ध्यान देने योग्य है कि वास्तव में गिराई गई वस्तुओं की मध्यम संख्या के लिए टिक प्रदर्शन में कमी आई है क्योंकि वे लगातार आसपास के लोगों की तलाश कर रहे हैं।
1:25 पर user253751

जवाबों:


48

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

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


त्वरित उत्तर के लिए धन्यवाद। मैं एकता का उपयोग करने के बारे में सोच रहा था क्योंकि मैं अनुमान लगा रहा हूं कि यह ट्रिगर कोलर्स की जांच करने के लिए कुछ प्रकार के स्थानिक विभाजन का उपयोग करता है, इसलिए मैं अपने चरित्र के चारों ओर एक बड़ा सर्कल कोलाडर बनाऊंगा और इसके अंदर प्रत्येक आइटम "एनिमेटेड" होगा। क्या यह आपके उत्तर को लागू करने का एक तरीका है? सही है अगर मैं गलत हूँ, चीयर्स!
अलकानु

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

हाँ, ऑब्जेक्ट पूलिंग इस स्थिति में अनिवार्य है :) ठीक है, बहुत-बहुत धन्यवाद!
अलकानु

3
@Alakanu आप Minecraft की "लोडेड चंक्स" अवधारणा की जांच कर सकते हैं कि यह गेम उस गेम पर कैसे लागू होता है।
टी। सार -

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

22

आपके पास प्रबंधित करने के लिए दो बहुत अलग चीजें हैं:

  1. सर्वर को आधिकारिक रूप से संपूर्ण विश्व का प्रबंधन करना चाहिए । उसके लिए, एन क्लाइंट (जहां एन "बड़े पैमाने पर" है) के साथ संचार आवश्यक है।

  2. क्लाइंट , सिद्धांत रूप में, पूरी दुनिया के बारे में जान सकता है, लेकिन इसकी आवश्यकता नहीं है । क्लाइंट के लिए, यह जानने के लिए पर्याप्त है कि खिलाड़ी के पास क्या है। उदाहरण के लिए बल्कि एक मोटे ग्रिड की तरह विभाजन के लिए, यह केवल खिलाड़ी के सेल और खिलाड़ी के आसपास 26 कोशिकाओं (या यदि आप एक 2D ग्रिड है 8 कोशिकाओं) को जानने की आवश्यकता होगी। कुछ हद तक बेहतर ग्रिड बेहतर है, लेकिन आपको यह विचार मिलता है।

अब, बहुत सारे पिकअप, "बहुत कुछ" क्या है? आप शायद प्रति सेकंड 5 चीजें खोदते हैं, शायद दो दर्जन नंबर हैं जिन्हें सर्वर पर अपडेट करने की आवश्यकता होती है, और सर्वर को उन कुछ अन्य खिलाड़ी को प्रेषित करना पड़ सकता है जिनकी रुचि का क्षेत्र आपके सेल को ओवरलैप करता है। एक कंप्यूटर के लिए, यह डेटा की काफी हास्यास्पद मात्रा है, और गणना की एक नापाक राशि है। एक ही सेल में सैकड़ों / हजार खिलाड़ी होने पर यह एक चुनौती बन सकता है (तब आपकी पैरेंटिंग बहुत मोटे है)।

सर्वर को पता करने की आवश्यकता नहीं है, न ही पिकअप के रोटेशन या इस तरह के विवरण की परवाह है। क्यों होगा?

ग्राहक वास्तव में या तो परवाह नहीं करता है, क्योंकि यह सिर्फ आंख कैंडी है जिसे ग्राहक मक्खी पर बना सकता है।

सर्वर के दृष्टिकोण से क्या आवश्यक है, यह जानकर कि आप जिस नोड में हैं (30, 40, 50) खोद रहे थे, और यह तय करता है कि यह प्रकार 5 की तीन वस्तुएं जैसे टाइप 7 की एक वस्तु या 7 के साथ एक वस्तु। 3. की ​​एक गिनती है। यह सब के बारे में परवाह है, और यह सब आपको बताता है। इसमें ग्रिड सेल पर अपने हित के क्षेत्र को आगे बढ़ाने वाले किसी व्यक्ति को भेजे गए डेटा में यह जानकारी भी शामिल होगी (यह मानते हुए कि यह तब भी वहां है)।

ग्राहक को तीन वस्तुएं बताई जाती हैं, जो ब्ला ब्ला होती हैं। अब, क्या ग्राहक ASCII- कला मानचित्र प्रदर्शित करता है जहां अब 'D' है या क्या यह गंदगी के ढेर को दिखाता है, यह सब समान है। चाहे बवासीर के अलग-अलग घुमाव हों या क्या केवल आपके खिलाड़ी के पास घूमने वाले सभी समान हैं, भी। यह सिर्फ सामान है जो आपके मॉनिटर पर प्रदर्शित होता है, यह किसी और को प्रभावित नहीं करता है।

तो, कंक्रीट के मामले में जिसे आप केवल गंदगी के पास के ढेर में घुमाना चाहते हैं, आप बस उन सभी वस्तुओं पर एक सीमा की जांच कर सकते हैं जिनके बारे में आप जानते हैं। चूंकि डेटा सेट बड़ा नहीं है, यहां तक ​​कि सब कुछ पर ब्रूट बल काम करेगा।

आप अपने विभाजन के आकार के आधार पर (और कर सकते हैं), तुच्छ रूप से ग्रिड कोशिकाओं को दूर कर सकते हैं जो बहुत दूर हैं।

बेशक, आप अपने सेल को सब-पार्टिशन कर सकते हैं और सुपर स्मार्ट का उपयोग कर सकते हैं। यदि आप चाहें तो kd-Tree का उपयोग करें, लेकिन भारी लाभ की उम्मीद न करें। आप मैनहट्टन डिस्ट्रेस के साथ सामान को दूर कर सकते हैं, या अपने सामान को अपने स्वयं के छोटे ग्रिड में सॉर्ट कर सकते हैं ... लेकिन क्यों?

एक दूरी की जांच (वास्तव में चुकता दूरी, लेकिन यह आपके लिए समान है) एक मात्र दो गुणा और एक अतिरिक्त (MUL, MADD के लिए अनुकूलित है, इसलिए वास्तव में सिर्फ दो संचालन हैं), इसके बाद एक शाखा या सशर्त चाल है। यह किसी भी अन्य ऑपरेशन के रूप में बहुत तेज है, जो एक समय में पूरे ग्रिड कोशिकाओं को prune नहीं करता है। वास्तव में, यह कुछ ऐसा है जो आप GPU पर भी कर सकते हैं ...

यह देखते हुए कि आपके पास कुछ सौ, या कम से कम कुछ हज़ार दूरी की जाँच में एक ही स्थिति के खिलाफ कैसे होगा (चुकता दूरी ठीक काम करती है), आपको वास्तव में उस गणना को करने में ज्यादा परेशानी नहीं होती है, और भी बहुत कुछ ऐसा है जैसे कि यह कैश नहीं है- मैत्रीपूर्ण स्मृति पर अनुकूल पुनरावृत्ति, और सशर्त चालों के साथ, यह सस्ता है। कुछ इस तरह (स्यूडोकोड) rot = r[i] + 1; r[i] = ((dx*dx+dy*dy) < DIST_SQ) ? rot : r[i];। यह फ्रेम के प्रति कुछ सौ मूल्यों की एक सरणी पर एक पुनरावृत्ति है। कंप्यूटर ऐसा करने के बारे में कम परवाह नहीं कर सकता है, यह सन्निहित भार और भंडार है, साधारण ALU, कोई शाखा नहीं, और केवल कुछ हज़ार पुनरावृत्तियों।

यह (कई-से-एक) समस्या का एक ही वर्ग (कई-से-कई) सर्वर पर नहीं है। वास्तव में, ग्राहक समस्या नहीं है।


मुझे क्षमा करें, मुझे लगा कि यह स्पष्ट है कि मैं एक क्लाइंट के बारे में बात कर रहा था जब मैंने फ्रैमरेट की बात करना शुरू किया।
अलकनु

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

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

1
@Alakanu यह आपके प्रश्न का एक विस्तृत और पूर्ण उत्तर की तरह दिखता है, मेरे लिए। अगर आपको लगता है कि यह कोई जवाब नहीं है, तो या तो आपने इसे गलत समझा है या आपका सवाल इतना अस्पष्ट है कि यह डेमन, मेरे और उन सभी लोगों द्वारा गलत समझा गया है, जिन्होंने इस जवाब को गलत ठहराया है।
डेविड रिचेर्बी

2
@Alakanu आप वास्तव में उन लोगों की शिकायत करने में बहुत समय खर्च करते हैं जो आपकी मदद करने की कोशिश कर रहे हैं। उसके साथ अच्छा भाग्य।
डेविड रिचरबी

2

@ T.Sar ने एक टिप्पणी में लिखा है कि आपको अधिक जानकारी के लिए Minecraft "भरी हुई चंक" अवधारणा पर ध्यान देना चाहिए। यदि आप करते हैं, तो ध्यान रखें कि यह गेम में मशीनों के निर्माण के कारण Minecraft में जटिल है।

एक बहुत ही सरल संस्करण इस प्रकार है:

दुनिया को वर्ग क्षेत्रों (हिस्सा) में विभाजित किया गया है। Minecraft में एक ऊंचाई विभाजन भी है लेकिन अधिकांश mmos को इसकी आवश्यकता नहीं है।

गेम क्लाइंट केवल खिलाड़ी के करीबी क्षेत्रों की परवाह करता है। यह खिलाड़ी के चारों ओर एक वृत्त खींचने की तुलना में बहुत सरल है, लेकिन पूरी तरह से अच्छा है।

Minecraft में, क्षेत्र 16x16 ब्लॉक हैं, और क्लाइंट को 9x9 क्षेत्र, प्रत्येक दिशा में 4 क्षेत्र के बारे में पता है। (4 क्षेत्र पूर्व + क्षेत्र खिलाड़ी + 4 क्षेत्रों पश्चिम = 9 क्षेत्रों में कुल है। समान उत्तर / दक्षिण)

इन संख्याओं के बारे में कुछ भी जादुई नहीं है, जो कुछ भी आपके खेल में समझ में आता है उसका उपयोग करें।

क्लाइंट केवल इस क्षेत्र के अंदर चीजों को एनिमेट करता है। सर्वर केवल उन क्षेत्रों में भटकने वाली चीजों की गणना करता है जो कुछ खिलाड़ी के करीब हैं ।

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

कई नेस्टेड एनीमेशन सीमा होने के साथ कुछ भी गलत नहीं है। उदाहरण के लिए एक 3x3 क्षेत्र में आइटम गिरता है, एक 5x5 क्षेत्र में राक्षसों को भटकने और 9x9 क्षेत्र में सिर्फ परिदृश्य दिखाते हैं।

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


ड्रॉ की दूरी समायोज्य है, लेकिन इस मामले में 8 विखंडू 9x9 है और क्लाइंट-साइड निर्णय है, यह सर्वर को चीजों को गति देने के लिए सूचित कर सकता है (हालांकि सर्वर क्लाइंट को रेंडर नहीं करेगा डेटा नहीं भेजता है)। इसके अलावा ... कयामत और भूकंप केवल उस समस्या को हल करने के बारे में हल नहीं करता है जो समझ में आता है?
SparK

गिरा आइटम के बारे में घृणा के बारे में ... पास के खिलाड़ी होने पर आइटम को केवल "उम्र" में हटा दें। तो आप एक गिराए गए आइटम को अनलोड किए गए चंक में "सहेज सकते हैं" और बाद में प्राप्त कर सकते हैं।
१२:१६ पर स्पार्क Sp ’
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.