2011-04-17 22 views
9

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

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

इस समस्या का मुकाबला करने के लिए, मैं एक अच्छे समाधान के साथ आने की कोशिश कर रहा हूं। मैंने फॉलो को देखा है, और इससे कुछ मदद मिली है, लेकिन पूरी तरह से नहीं: Mutli Player Game synchronization। मैं पहले ही इस निष्कर्ष पर आया हूं कि खेल की वर्तमान स्थिति को प्रेषित करने के बजाय, मैं अन्य जानकारी जैसे दिशा (या एआई आंदोलन के लिए लक्ष्य स्थिति) और गति भेज सकता हूं। इससे, मेरे पास भविष्य में गेम स्टेट एन मिलीसेकंड की प्रगति करके क्लाइंट साइड पर वास्तविक अनुमान क्या है (जैसा सर्वर इसे देखता है) पर 'अनुमान लगाने' के लिए आवश्यक है।

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

कोई सुझाव?

दोहराना करने के लिए:

1) सबसे अच्छा तरीका है भेजने और प्राप्त के बीच समय की राशि की गणना करने के क्या है?

2) क्या मुझे क्लाइंट साइड स्टेटस को पूरी राउंड ट्रिप के लिए गिनने के लिए पर्याप्त प्रगति करना चाहिए, या सर्वर से डेटा प्राप्त करने के लिए बस इतना समय लगता है?

संपादित करें: क्या मैं के साथ अब तक

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

शुरू करने के लिए, मैं ग्राहकों को अपने अंतराल का अनुमान लगाने का प्रयास करूंगा। मैं इसे 50 से 100 मिलीसेकंड की तरह कुछ डिफ़ॉल्ट कर दूंगा। मैं प्रस्ताव दे रहा हूं कि प्रत्येक 2 सेकंड (प्रति क्लाइंट) के बारे में सर्वर तुरंत इन पैकेटों में से एक को जवाब देगा, एक विशेष समय अद्यतन पैकेट में पैकेट इंडेक्स वापस भेज देगा। यदि क्लाइंट टाइमिंग पैकेट प्राप्त करता है, तो यह सूचकांक का उपयोग करेगा कि इस पैकेट को कितनी देर पहले भेजा गया था, और फिर पैकेट के बीच के समय को नए अंतराल के रूप में उपयोग करें।

यह ग्राहकों को बहुत अधिक अतिरिक्त नेटवर्क यातायात के साथ, अपने अंतराल पर उचित रूप से अद्यतित रखना चाहिए।

ध्वनि स्वीकार्य है, या क्या कोई बेहतर तरीका है? यह अभी भी प्रश्न दो का जवाब नहीं देता है।

उत्तर

2

2) क्या मुझे क्लाइंट साइड स्टेटस को पूरी राउंड ट्रिप के लिए गिनने के लिए पर्याप्त प्रगति करना चाहिए, या सर्वर से डेटा प्राप्त करने के लिए बस इतना समय लगता है?

मान लेते हैं कि सर्वर समय T0 पर राज्य भेजता है, ग्राहक, समय टी 1 में देखता खिलाड़ी समय टी 2 में प्रतिक्रिया करता है, और सर्वर समय T3 में अपने जवाब प्राप्त है, और इसे तुरंत संसाधित करता है। यहां, राउंड ट्रिप देरी टी 1-टी 0 + टी 3-टी 2 है। एक आदर्श दुनिया में, टी 0 = टी 1 और टी 2 = टी 3, और पर्यवेक्षण समय और खिलाड़ी की कार्रवाई के प्रसंस्करण के बीच एकमात्र देरी खिलाड़ी की प्रतिक्रिया समय है, यानी टी 2-टी 1। असली दुनिया में यह टी 3-टी 0 है। तो आदेश आदर्श दुनिया आप पूरे राउंड ट्रिप देरी घटाना करने की जरूरत है अनुकरण में:

T2-T1 = T3-T0 + (T1-T0 + T3-T2) 

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

पूरी प्रक्रिया में कोई समस्या है: आप भविष्य में बाहर निकल रहे हैं और इससे गैरकानूनी परिस्थितियां हो सकती हैं। उनमें से कुछ, दीवारों में डाइविंग की तरह आसानी से रोका जा सकता है, लेकिन खिलाड़ी की बातचीत के आधार पर जो लोग नहीं कर सकते हैं।

हो सकता है कि आप अपने विचार बदल सकती है उल्टा: - (T1-T0 + T3-टी 2) पूर्वानुमान के बजाय , समय टी 3 पर खिलाड़ी की कार्रवाई का मूल्यांकन करने का प्रयास करें। यदि आप यह निर्धारित करते हैं कि एक चरित्र इस तरह से मारा जाएगा, तदनुसार इसके हिट पॉइंट को कम करें। यह मूल विचार या तो यथार्थवादी हो सकता है, या यह बुरा हो सकता है, या बिल्कुल लागू नहीं हो सकता है। एक विचार है।


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

+0

"लेकिन यह काफी असंभव परिदृश्य है, है ना?" क्या होगा यदि एक डिवाइस सेलुलर कनेक्शन का उपयोग कर रहा है और दूसरा वाईफाई का उपयोग कर रहा है? सिर्फ एक विचार। किसी भी तरह से, आप कह रहे हैं कि मैं उस उपयोगकर्ता को उस राज्य को प्रदर्शित करता हूं जिस पर गेम उनकी प्रतिक्रिया सर्वर पर वापस आ जाएगा, सही होगा? –

+0

* "सेलुलर कनेक्शन और वाईफ़ाई" * - आमतौर पर, दोनों तेज कनेक्शन का उपयोग करने का प्रयास करेंगे। वे इस तरह से धोखा देने की कोशिश कर सकते हैं, लेकिन यह मेरे लिए थोड़ा अधिक जटिल लग रहा है। यह धोखाधड़ी का एक प्रकार होगा, लेकिन एमएमओ में धोखा देने के लिए बहुत आसान तरीके हैं। – maaartinus

+0

और हाँ, मैं यह कह रहा था। अब मैं जोड़ रहा हूं, कि आप सभी खिलाड़ियों के लिए एक छोटे से स्थिरता से समय अंतर को कम कर सकते हैं। कम extrapolation कम समस्या का मतलब हो सकता है; एक विचार है। – maaartinus

4

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

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

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

मैं जानता हूँ कि क्या यह आपके प्रश्न का शाब्दिक अर्थ से थोड़ा दूर है, लेकिन दो एक नेटवर्क 100ms पर एक दूसरे के बगल में बैठे मशीनों एक बार आप बाहर मिल वास्तव में आशावादी है ... इस को हल करने के

+0

मैं मानता हूं कि मैं मिलीसेकंड में होने वाले अंतराल पर निर्भर नहीं हो सकता, लेकिन मुझे यह जानने की ज़रूरत है कि यह क्या है। –

+0

ग्राहक को हिट गणना करने की सावधानी बरतें - जो ऑटो-हिट क्लाइंट के साथ धोखेबाज़ों को धोखा देने का आसान तरीका बनाता है। –

+1

मैं क्लाइंट को उन गणनाओं को करने की अनुमति नहीं दे रहा हूं, केवल एनिमेशन। –

2

एक ही रास्ता इस तरह की समस्या क्लाइंट और सर्वर पर गेम सिमुलेशन चला रही है।

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

यदि वे मेल नहीं खाते (खिलाड़ी धोखाधड़ी, झटके), तो यह क्लाइंट को वीटो भेजता है और कार्रवाई सर्वर पर सफल के रूप में दर्ज नहीं की जाती है। इसका मतलब है कि अन्य सभी क्लाइंट इसे नोटिस नहीं करते हैं (सर्वर अन्य क्लाइंट को कार्रवाई अग्रेषित नहीं करता है)।

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

यह कहा गया: अधिकांश नेटवर्क इतने तेज़ हैं कि अंतराल कुछ मिलीसेकंड के क्षेत्र में होना चाहिए। इसका मतलब है कि आपको "बस" को सर्वर को पर्याप्त तेज़ी से बनाना है, इसलिए < 100ms के साथ प्रतिक्रिया दे सकती है और खिलाड़ियों को नोटिस नहीं होगा।

संबंधित मुद्दे