दुनिया के बारे में गेम क्लाइंट को कितनी बार अपडेट करना है?


10

सॉकेट.आईओ का उपयोग करते हुए , मेरे पास अन्य MMORPGs के समान संचार है, संदेशों के साथ एक स्थिर संबंध है।

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

क्या एक दूसरे के 1/10 में एक बार, इन को इकट्ठा करना और उन्हें प्रसारित करना बेहतर होगा?

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

जवाबों:


16

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

एक MMORPGs इंजन के नेटवर्क आर्किटेक्चर का डिजाइन और / या कार्यक्षमता प्रदान करने के लिए एक मध्य-वेयर या ओपन सोर्स प्रोजेक्ट का चयन गेम डिजाइन, बजट और टीम की तकनीकी विशेषज्ञता से प्रभावित अधिक चुनौतीपूर्ण निर्णयों में से एक है। अंतिम विकल्प अन्य वास्तुशिल्प निर्णयों को प्रभावित करेगा (और कभी-कभी निर्णय डिजाइन भी करता है)।

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

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

अधिकांश MMORPGs और कई FPS इंजनों में काफी परिष्कृत नेटवर्किंग आर्किटेक्चर होते हैं जो विभिन्न प्रकार की सुविधाओं का समर्थन करते हैं:

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

मुझे लगता है कि अवास्तविक नेटवर्किंग प्रलेखन और वाल्व नेटवर्किंग प्रलेखन विभिन्न मुद्दों पर एक अच्छा प्राइमर प्रदान करते हैं।

तो, अब प्रश्नों को देखने की अनुमति देता है।

क्या एक दूसरे के 1/10 में एक बार, इन को इकट्ठा करना और उन्हें प्रसारित करना बेहतर होगा?

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

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

सॉकेट.इओ प्रलेखन की सरसरी समीक्षा से, ऐसा लगता है कि यह विश्वसनीय और अविश्वसनीय (इसकी शब्दावली में अस्थिर) संचार पथ दोनों का समर्थन करता है।

मैं पहले से निपटने के दृष्टिकोण से, क्या आवृत्ति की जरूरत अद्यतन कर रहे हैं ...

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

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

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

क्या ग्राहक को कई अलग-अलग संदेश भेजे जाते हैं (जैसे अर्जित, आइटम पर क्लिक किया गया) जैसे ही वे होते हैं या केवल एक एकत्र होता है?

फिर, कोई सरल हाँ या कोई जवाब नहीं यहाँ काम करने जा रहा है। आपके द्वारा एकत्र किए जाने से आपका क्या मतलब है ... इसके आधार पर दोनों अलग-अलग परिस्थितियों में सही हो सकते हैं और नेटवर्किंग लेयर के कार्यान्वयन पर भी निर्भर करते हैं।

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

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

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


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

5

यहाँ एक वास्तविक दुनिया उदाहरण है: RuneScape "टिक" हर ~ 0.6 सेकंड में एक बार। आप इसके बारे में यहां पढ़ सकते हैं । मुझे लगता है कि यह उनके दृष्टिकोण से चीजों को सरल करता है, क्योंकि उनकी लिपियों में वे शायद मिलीसेकंड के बजाय टिक्सेस में समय और देरी निर्दिष्ट करते हैं। और निश्चित रूप से, इतनी बड़ी / धीमी टिक दर के साथ, धीमे कनेक्शन वाले उपयोगकर्ता अन्य खिलाड़ियों की तुलना में भारी नुकसान में नहीं हैं।


0

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

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


मैं नहीं होता? पोज़ या किसी चीज़ के बारे में, मुझे यह सुनिश्चित करने की ज़रूरत है कि सभी ग्राहक समान देखें?
लैंबो नोव

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