मैं एक उच्च-स्तरीय चर्चा से यह संपर्क करने जा रहा हूं और फिर आपके प्रश्नों की दिशा में काम करूंगा। प्रकटीकरण के लिए, मुझे socket.io का उपयोग करने का कोई व्यक्तिगत अनुभव नहीं है, लेकिन MMORPG के संबंध में समस्या स्थान के लिए बहुत अधिक जोखिम है।
एक MMORPGs इंजन के नेटवर्क आर्किटेक्चर का डिजाइन और / या कार्यक्षमता प्रदान करने के लिए एक मध्य-वेयर या ओपन सोर्स प्रोजेक्ट का चयन गेम डिजाइन, बजट और टीम की तकनीकी विशेषज्ञता से प्रभावित अधिक चुनौतीपूर्ण निर्णयों में से एक है। अंतिम विकल्प अन्य वास्तुशिल्प निर्णयों को प्रभावित करेगा (और कभी-कभी निर्णय डिजाइन भी करता है)।
MMORPGs के डेवलपर्स के रूप में, हम बड़ी सफलता की योजना बनाते हैं (जिसे अक्सर भयावह सफलता के रूप में भी जाना जाता है) जहां बड़ी संख्या में चेतावनी रोशनी और सायरन ट्रिगर होते हैं। डरावनी बड़ी संख्याओं में से एक जो फसलें एल्गोरिदम में होती है जो कि एन-स्क्वेर्ड (एन ^ 2 उसके बाद) होती हैं, आपके सवाल में पहली चीज जो मेरे लिए कूदती है वह यह है कि यह एक ऐसे डिजाइन की तरह लगती है जिसे सूचना प्रसारित करने के लिए एक इकाई के लिए बुलाया जाता है। अन्य सभी संबंधित इकाइयाँ। यह N ^ 2 समस्या का उत्कृष्ट उदाहरण है।
आम तौर पर कई अलग-अलग तरीकों से समस्या पर हमला करके एनआईआर 2 मुद्दों को संबोधित करते हुए MMO; जागरूकता प्रणाली (स्थितिजन्य, स्थानिक, आदि) जहां एक इकाई अन्य सभी संस्थाओं के कुछ सबसेट के बारे में जानती है, खिलाड़ियों को अलग-अलग "शार्क" में विभाजित करती है, खिलाड़ियों को "जोन" और / या में विभाजित करती है, खेल यांत्रिकी को हतोत्साहित करती है। एक साथ एकत्र होने से खिलाड़ी (एशेरोन कॉल के टेलीपोर्ट तूफान), आदि।
अधिकांश MMORPGs और कई FPS इंजनों में काफी परिष्कृत नेटवर्किंग आर्किटेक्चर होते हैं जो विभिन्न प्रकार की सुविधाओं का समर्थन करते हैं:
- विश्वसनीय और अविश्वसनीय संचार रास्ते (टीसीपी, विश्वसनीय यूडीपी और यूडीपी पैकेट के कस्टम कार्यान्वयन)
- बैंडविड्थ को आकार देने (प्राथमिकता, जीवन काल, आदि)
- क्षेत्र / viarable डेटा और फ़ंक्शन कॉल की स्वचालित प्रतिकृति
- डेटा के परमाणु सेट (यानी एक साथ संचारित डेटा)
- असतत अद्यतन (यानी जहां हर परिवर्तन महत्वपूर्ण है)
- विलंबता सुधार
- ग्राहक को उत्तरदायी बनाने के लिए कई तरह के टोटके
मुझे लगता है कि अवास्तविक नेटवर्किंग प्रलेखन और वाल्व नेटवर्किंग प्रलेखन विभिन्न मुद्दों पर एक अच्छा प्राइमर प्रदान करते हैं।
तो, अब प्रश्नों को देखने की अनुमति देता है।
क्या एक दूसरे के 1/10 में एक बार, इन को इकट्ठा करना और उन्हें प्रसारित करना बेहतर होगा?
यहां एक सरल हां या कोई उत्तर प्रदान करना कठिन है ... क्योंकि यह पैमाने (अवलोकन करने वाली संस्थाओं की संख्या), अपडेट की आवृत्ति और अपडेट के आकार पर निर्भर करता है। उदाहरण के लिए, उन सभी को इकट्ठा करना बुरी तरह से गलत हो सकता है अगर अपडेट का आकार कहीं बफर को उड़ा सकता है।
MMORPGs और FPS गेम के लिए क्लाइंट को आमतौर पर ऐसे डिज़ाइन किया जाता है कि वे किसी ऐसी चीज़ की कल्पना करेंगे, जो "सामान्य" होने के बावजूद कई और अपडेट फ्रेम के लिए अपडेट न मिलने पर भी "सही" लगती है। अविश्वसनीय संचार (यूडीपी) का उपयोग करते समय आप केवल कुछ अपडेट को शून्य में खो देने की उम्मीद कर सकते हैं, क्लाइंट एक विश्वसनीय परिवहन के साथ उपयोग किए जाने की तुलना में अधिक लगातार अपडेट भेजकर इसके लिए बना सकते हैं।
सॉकेट.इओ प्रलेखन की सरसरी समीक्षा से, ऐसा लगता है कि यह विश्वसनीय और अविश्वसनीय (इसकी शब्दावली में अस्थिर) संचार पथ दोनों का समर्थन करता है।
मैं पहले से निपटने के दृष्टिकोण से, क्या आवृत्ति की जरूरत अद्यतन कर रहे हैं ...
यदि कोई खिलाड़ी एक स्थिर दर पर एक सीधी रेखा में घूम रहा है, तो एक कम अद्यतन आवृत्ति ठीक है क्योंकि अवलोकन करने वाले ग्राहक उच्च सटीकता के साथ भविष्यवाणी कर सकते हैं जहां खिलाड़ी किसी भी समय पर होगा। जब एक खिलाड़ी एक तंग सर्कल में बदल रहा है या तेजी से दिशा बदल रहा है, तो बहुत अधिक लगातार अपडेट की आवश्यकता होती है। इसके विपरीत, जब कोई खिलाड़ी बिलकुल नहीं चल रहा होता है, तो आंदोलन के अपडेट को भेजने का कोई कारण नहीं होता है।
कोई बात नहीं, क्लाइंट से सर्वर तक हर फ्रेम को अपडेट भेजने के लिए (आमतौर पर) आवश्यक नहीं है। सर्वर स्वयं प्रत्येक फ्रेम को संदेश भेजने का विकल्प चुन सकता है जहां यह उनके पास है, या उन्हें देरी (बैंडविड्थ को आकार देने, प्राथमिकता और जीवन भर अपडेट करने के लिए देखें)।
अन्य प्रकार के अपडेट में अलग-अलग विशेषताएं हैं ... उदाहरण के लिए "स्वास्थ्य" क्षेत्र पर विचार करें जो एक खिलाड़ी या प्राणी क्षतिग्रस्त होने पर संशोधित होता है। इसे लागू करने का एक तरीका यह होने पर प्रत्येक परिवर्तन को तुरंत प्रसारित किया जाता है, लेकिन इससे प्रोसेसिंग और बैंडविड्थ बर्बाद हो जाता है अगर मूल्य को एक फ्रेम या लगातार फ्रेम में कई बार बदला जाता है (नेटवर्किंग आर्किटेक्चर जो बैंडविड्थ को आकार देने को लागू करते हैं, इस मुद्दे को अपडेट को समतल करके हल करते हैं। केवल सबसे हाल ही में एक अवलोकन क्लाइंट को भेजा जाता है जब उनके पास बैंडविड्थ उपलब्ध है)।
क्या ग्राहक को कई अलग-अलग संदेश भेजे जाते हैं (जैसे अर्जित, आइटम पर क्लिक किया गया) जैसे ही वे होते हैं या केवल एक एकत्र होता है?
फिर, कोई सरल हाँ या कोई जवाब नहीं यहाँ काम करने जा रहा है। आपके द्वारा एकत्र किए जाने से आपका क्या मतलब है ... इसके आधार पर दोनों अलग-अलग परिस्थितियों में सही हो सकते हैं और नेटवर्किंग लेयर के कार्यान्वयन पर भी निर्भर करते हैं।
विशिष्ट संदेश के लिए संदेश एकत्रित करना एक संदेश के रूप में भेजा जा सकता है (कार्यान्वयन के आधार पर) संदेश भेजने के लिए बैंडविड्थ ओवरहेड को कम करना (आपकी लागतों को कम करना) इसके विपरीत (कार्यान्वयन के आधार पर, जैसे फ़ील्ड / मूल्य मैपिंग स्ट्रिंग्स द्वारा संचारित) बैंडविड्थ बढ़ा सकते हैं एक सरल विशिष्ट संदेश प्रकार की तुलना में आवश्यकताएं।
सॉकेट.आईओ दस्तावेज़ीकरण की समीक्षा करते हुए, यह मेरे लिए प्रकट होगा कि संदेश ओवरहेड स्पेक्ट्रम के उच्च अंत पर है जो एक एकल संदेश के रूप में बहुत सारे अद्यतनों के विपरीत भेजने के लिए अद्यतन एकत्र करने के पक्ष में होगा।
मैं उन सभी अद्यतनों की समीक्षा करने की सलाह देता हूं, जिन्हें आप दोहराने पर विचार करते हैं, उदाहरण के लिए अधिकांश MMORPGs और FPS खिलाड़ी को देखने के लिए X ईवेंट पर क्लिक करने की जहमत नहीं उठाते हैं, जब तक कि किसी वस्तु के लिए एक राज्य परिवर्तन का परिणाम नहीं होगा, जिसके बारे में वे जानते थे। ।