मुझे पता है कि मेरा सुपर सरल मल्टीप्लेयर सेटअप शायद एक अच्छा विचार नहीं है, लेकिन क्यों?


11

मैं सिर्फ मनोरंजन के लिए एक साधारण सा MOBA बना रहा हूं। मैं सब कुछ एकल-खिलाड़ी बना रहा था तब मुझे एहसास हुआ कि "ओह बकवास मुझे शायद मल्टीप्लेयर जोड़ना चाहिए, हुह।"

मैंने पहले कभी भी नेटवर्किंग के साथ कुछ नहीं किया है, इसलिए अपने खेल में लिडग्रेन को एकीकृत करना सीखना मजेदार और भयानक था। बात यह है, मैं बहुत ज्यादा जानता हूं कि मैं जिस तरह से चीजें कर रहा हूं वह गलत है, क्योंकि यह मुख्यधारा के खेलों का उपयोग करने के लिए पर्याप्त मजबूत नहीं है, जहां तक ​​मुझे पता है, लेकिन इसमें क्या गलत है?

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

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

तो मूल रूप से:

  • खिलाड़ी 1 उसे छह सेकंड के लिए 100% तेजी से आगे बढ़ने के लिए एक जादू देता है
  • प्लेयर 1 का स्थानीय क्लाइंट उस बफ़ को अपने यूनिट ऑब्जेक्ट में जोड़ता है
  • प्लेयर 1 का क्लाइंट सर्वर को एक संदेश भेजता है जिसमें कहा जाता है "अरे मैंने अभी यह जादू डाला है"
  • सर्वर सुनिश्चित करता है कि उसके पास वास्तव में उस वर्तनी को डालने के लिए पर्याप्त मान था, और यदि ऐसा है, तो उस इकाई ऑब्जेक्ट के सर्वर की प्रति में उस बफ़ को जोड़ता है
  • सर्वर यह कहते हुए सभी अन्य ग्राहकों को संदेश भेजता है कि "अरे इस आदमी ने अभी यह जादू डाला है"
  • हर दूसरा क्लाइंट संदेश प्राप्त करता है और "आह ओके कूल," जाता है और उस खिलाड़ी के लिए उस स्थानीय यूनिट ऑब्जेक्ट में उस बफ़ को जोड़ता है

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

क्षमा करें यदि यह थोड़ा सा विचित्र है, लेकिन मूल रूप से, मैं सोच रहा था कि मेरी सरल प्रणाली जाने का सही तरीका क्यों नहीं है, क्योंकि अगर यह होता, तो अन्य खेल इसका उपयोग करते, सही?


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

1
क्या कमाल है कि हम में से बाकी लोगों को उचित उम्मीद है कि नेटवर्क उतना कठिन नहीं है। यह उल्लेखनीय है।
21999 पर ashes999

जवाबों:


12

बाइटे56 के जवाब के अलावा, कुछ और बातों पर विचार करना होगा:

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

एक दूसरा मुद्दा, जो पिछले वाले से जुड़ता है, वह यह है कि यूडीपी की डिलीवरी की गारंटी नहीं है। आप निश्चित नहीं हो सकते हैं कि आपके द्वारा भेजा गया प्रत्येक संदेश सही क्रम में आता है, या यहां तक ​​कि आता है। आप पैकेट 1, 2, और 3 भेज सकते हैं, और सर्वर 3 तो 1 और 2 प्राप्त करता है। अक्सर वे सही क्रम में होंगे, और अक्सर वे पहुंचेंगे, लेकिन हमेशा नहीं। तो, आपको एक ऐसी प्रणाली की आवश्यकता है जो पैकेट खोने के लिए मजबूत हो। एक सरल पुष्टिकरण प्रणाली पर्याप्त है। आमतौर पर उपयोग किया जाने वाला एक बिटफील्ड है जो दूसरे नोड को बताता है कि क्या उसे पिछले 32 संदेश (32 बिट इंट के लिए) मिले हैं, और अंतिम संदेश क्या मिला था। इस तरह, आप संदेशों को आलोचनात्मक या नहीं के रूप में लेबल कर सकते हैं, और यदि वे महत्वपूर्ण नहीं प्राप्त करते हैं तो फिर से भेजें। यहाँ इसकी बहुत अच्छी चर्चा है

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

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

अधिक विचारों के लिए, मैं उस दूसरे लिंक में अन्य लेख ब्राउज़ करने की सलाह देता हूं।

सौभाग्य!


6

आप जो वर्णन कर रहे हैं वह अनिवार्य रूप से क्लाइंट-साइड भविष्यवाणी है , लेकिन आप यह नहीं कहते कि सर्वर और क्लाइंट असहमत होने पर क्या होता है।

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

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


5

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

मान लें कि जैसे ही वे आते हैं हर कोई पैकेट पर कार्य करता है।

@ Time 0 (wall time), Player 1 puts up a shield   (Message has been sent, but not received by anyone)
@ Time 1, Player 2 shoots player 1   (Message has been sent, but not received by anyone)

मान लें समय 0 (T0) और T1 एक साथ करीब हैं।

आगे क्या होता है यह इस बात पर निर्भर करता है कि कौन इसे देख रहा है, और किस क्रम में पैकेट सर्वर पर आता है। सर्वर को हमेशा अंतिम कहना चाहिए। यदि सर्वर ऊपर दिए गए क्रम में पैकेट प्राप्त करता है, तो सर्वर शॉट से पहले ढाल को लागू करेगा और खिलाड़ी 1 (P1) जीवित रहेगा। पी 1 के नजरिए से, ढाल को खुद रखने के बाद, वह शॉट से पहले ढाल को देखेगा और जीवित रहेगा। लेकिन पी 2 का क्या? वे शॉट को तुरंत देखेंगे क्योंकि उन्होंने इसे शूट किया था, लेकिन क्या वे पहले ढाल देखेंगे? अगर (T0 + latency between P1 and the server + the latency between the server and P2) > T1, शॉट के बाद ढाल ऊपर आ जाएगी, और P2 को लगेगा कि उनके शॉट ने P1 को मार दिया है। सर्वर को किसी तरह इस स्थिति को ठीक करना होगा।

हालांकि, यदि सर्वर पैकेट को रिवर्स ऑर्डर में प्राप्त करता है (जो कि काफी संभव है, भले ही T0 <T1), तो विपरीत होता है। पी 1 गलत (और मृत) है, जबकि पी 2 सही (और विजयी) है।

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

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

टाइम इज फन एह? कोई फर्क नहीं पड़ता कि आप क्या कर रहे हैं, इन समय के मुद्दों के बारे में पता होना मददगार है।

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