मैं क्लाइंट सर्वर MMO शैली गेम बना रहा हूं। अब तक मेरे पास ढांचा तैयार है ताकि सर्वर अपडेट और ग्राहक अपडेट अपडेट करने के लिए एक दूसरे के साथ बातचीत कर सकें। सर्वर गेम स्थिति को बनाए रखता है और समय-समय पर अगले राज्य की गणना करता है और फिर यह हर बार थोड़ी देर में (प्रत्येक एन मिलीसेकंड) यह सभी ग्राहकों को नया राज्य भेजता है। यह नया राज्य उपयोगकर्ता द्वारा ग्राहक पक्ष पर देखा और प्रतिक्रिया करने में सक्षम है। फिर इन क्रियाओं को संसाधित करने के लिए सर्वर पर वापस भेजा जाता है और अगले अद्यतन के लिए भेजा जाता है।क्लाइंट-सर्वर गेम स्थिति सिंक्रनाइज़ करना
स्पष्ट समस्या यह है कि इन अद्यतनों के लिए सर्वर और ग्राहकों के बीच यात्रा करने में समय लगता है। यदि कोई ग्राहक किसी दुश्मन पर हमला करने के लिए कार्य करता है, तब तक जब सर्वर सर्वर पर वापस आ गया है, तो यह बहुत संभव है कि सर्वर ने गेम राज्य को इतनी पर्याप्त प्रगति की है कि दुश्मन अब एक ही स्थान पर और सीमा से बाहर नहीं है।
इस समस्या का मुकाबला करने के लिए, मैं एक अच्छे समाधान के साथ आने की कोशिश कर रहा हूं। मैंने फॉलो को देखा है, और इससे कुछ मदद मिली है, लेकिन पूरी तरह से नहीं: Mutli Player Game synchronization। मैं पहले ही इस निष्कर्ष पर आया हूं कि खेल की वर्तमान स्थिति को प्रेषित करने के बजाय, मैं अन्य जानकारी जैसे दिशा (या एआई आंदोलन के लिए लक्ष्य स्थिति) और गति भेज सकता हूं। इससे, मेरे पास भविष्य में गेम स्टेट एन मिलीसेकंड की प्रगति करके क्लाइंट साइड पर वास्तविक अनुमान क्या है (जैसा सर्वर इसे देखता है) पर 'अनुमान लगाने' के लिए आवश्यक है।
समस्या राज्य की प्रगति के लिए समय की मात्रा निर्धारित कर रही है, क्योंकि यह सर्वर और क्लाइंट के बीच अंतराल पर निर्भर करेगा, जो काफी भिन्न हो सकती है। साथ ही, क्या मुझे खेल स्थिति में प्रगति करनी चाहिए कि वर्तमान में यह क्या होगा जब ग्राहक इसे देखता है (यानी ग्राहक के लिए अपडेट करने के लिए केवल खाता ही खाता है) या क्या मुझे इसे काफी प्रगति करनी चाहिए ताकि जब इसकी प्रतिक्रिया भेजी जाए सर्वर पर वापस, यह तब तक सही स्थिति होगी (यात्रा के लिए और दोनों के लिए खाता)।
कोई सुझाव?
दोहराना करने के लिए:
1) सबसे अच्छा तरीका है भेजने और प्राप्त के बीच समय की राशि की गणना करने के क्या है?
2) क्या मुझे क्लाइंट साइड स्टेटस को पूरी राउंड ट्रिप के लिए गिनने के लिए पर्याप्त प्रगति करना चाहिए, या सर्वर से डेटा प्राप्त करने के लिए बस इतना समय लगता है?
संपादित करें: क्या मैं के साथ अब तक
के बाद से मैं पहले से ही कई पैकेट आगे पीछे ग्राहकों और सर्वर के बीच जा रहा है, मैं अगर मैं करने के लिए है कि यातायात में जोड़ने के लिए नहीं करना चाहती आए हैं। वर्तमान में, ग्राहक स्टेटस अपडेट पैकेट (यूडीपी) सर्वर ~ 150 मिलीसेकंड (केवल कुछ बदल गया है) को भेजते हैं, और फिर ये सर्वर द्वारा प्राप्त और संसाधित होते हैं। वर्तमान में, सर्वर इन पैकेटों पर कोई प्रतिक्रिया नहीं भेजता है।
शुरू करने के लिए, मैं ग्राहकों को अपने अंतराल का अनुमान लगाने का प्रयास करूंगा। मैं इसे 50 से 100 मिलीसेकंड की तरह कुछ डिफ़ॉल्ट कर दूंगा। मैं प्रस्ताव दे रहा हूं कि प्रत्येक 2 सेकंड (प्रति क्लाइंट) के बारे में सर्वर तुरंत इन पैकेटों में से एक को जवाब देगा, एक विशेष समय अद्यतन पैकेट में पैकेट इंडेक्स वापस भेज देगा। यदि क्लाइंट टाइमिंग पैकेट प्राप्त करता है, तो यह सूचकांक का उपयोग करेगा कि इस पैकेट को कितनी देर पहले भेजा गया था, और फिर पैकेट के बीच के समय को नए अंतराल के रूप में उपयोग करें।
यह ग्राहकों को बहुत अधिक अतिरिक्त नेटवर्क यातायात के साथ, अपने अंतराल पर उचित रूप से अद्यतित रखना चाहिए।
ध्वनि स्वीकार्य है, या क्या कोई बेहतर तरीका है? यह अभी भी प्रश्न दो का जवाब नहीं देता है।
"लेकिन यह काफी असंभव परिदृश्य है, है ना?" क्या होगा यदि एक डिवाइस सेलुलर कनेक्शन का उपयोग कर रहा है और दूसरा वाईफाई का उपयोग कर रहा है? सिर्फ एक विचार। किसी भी तरह से, आप कह रहे हैं कि मैं उस उपयोगकर्ता को उस राज्य को प्रदर्शित करता हूं जिस पर गेम उनकी प्रतिक्रिया सर्वर पर वापस आ जाएगा, सही होगा? –
* "सेलुलर कनेक्शन और वाईफ़ाई" * - आमतौर पर, दोनों तेज कनेक्शन का उपयोग करने का प्रयास करेंगे। वे इस तरह से धोखा देने की कोशिश कर सकते हैं, लेकिन यह मेरे लिए थोड़ा अधिक जटिल लग रहा है। यह धोखाधड़ी का एक प्रकार होगा, लेकिन एमएमओ में धोखा देने के लिए बहुत आसान तरीके हैं। – maaartinus
और हाँ, मैं यह कह रहा था। अब मैं जोड़ रहा हूं, कि आप सभी खिलाड़ियों के लिए एक छोटे से स्थिरता से समय अंतर को कम कर सकते हैं। कम extrapolation कम समस्या का मतलब हो सकता है; एक विचार है। – maaartinus