क्लाइंट साइड भविष्यवाणी के साथ चलती वस्तुओं के लिए क्षतिपूर्ति कैसे करें?


11

मैं एक गेम सर्वर लागू कर रहा हूं जो स्टार कंट्रोल जैसी हाथापाई का समर्थन करता है । तो आपके पास आंदोलन को चलाने के लिए सुपर सिंपल वेलोसिटी / एक्सेलेरेशन / डैम्पनिंग फिजिक्स के साथ जहाज उड़ाने और शूटिंग है।

यहाँ छवि विवरण दर्ज करें

मैंने वाल्व, गैफ़रॉन और गैम्बेटा को पढ़ा है और क्लाइंट भविष्यवाणी के लिए गैम्बेटा के एल्गोरिथ्म को लागू किया है :

यहाँ छवि विवरण दर्ज करें

क्लाइंट पूर्वानुमान सर्वर से अपनी स्थिति को अपडेट करके प्लेयर शिप पर काम करता है और फिर प्लेयर शिप पर अभी तक अप्रमाणित बाय-सर्वर इनपुट को फिर से लागू करता है।

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

यहाँ छवि विवरण दर्ज करें

प्लेयर कमांड क्लाइंट स्टेप 3 पर चलता है , लेकिन सर्वर पर इसका सर्वर केवल चरण 5 पर चलता है । जब तक क्लाइंट स्नैप 6 में विश्व स्नैपशॉट ग्राहक द्वारा प्राप्त किया जाता है , तब तक भविष्यवाणी बंद हो जाती है, खासकर तेज वेग में।

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

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

मेरे सवाल:

  • क्या आप गैम्बेटा के एल्गोरिथ्म को निरंतर कदम आंदोलन के साथ काम कर सकते हैं? या यह मेरे खेल के साथ वैचारिक रूप से असंगत है?

  • क्या इसके बाद धीरे-धीरे प्रक्षेप करना सही तरीका है? यदि ऐसा है, तो आप क्लाइंट स्थिति से पहले से ही चलती ऑब्जेक्ट को कैसे मिलान करते हैं जो कि सर्वर से प्राप्त हुआ था?

  • क्या ये तरीके, क्रमिक प्रक्षेप और गैम्बेटा के एल्गोरिथम मिलकर काम कर सकते हैं या वे परस्पर अनन्य हैं?


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

@MakuraYami हां - मैंने समाधान का वर्णन करते हुए एक लेख लिखना शुरू कर दिया है। जल्द ही अपडेट होगा!
ओफेरेव

मैंने अपनी परियोजना पर अधिक काम किया है और एक उपयोगी समाधान और इस मुद्दे के बारे में बात करने वाले कुछ और अच्छे संसाधनों को पाया है। मुझे आगे चर्चा करने, समाधानों की तुलना करने आदि में दिलचस्पी है। मुझे बताएं कि मैं आपसे कहां संपर्क कर सकता हूं :)
MakuraYami

@makurayami मेरा उपयोगकर्ता नाम Gmail पर
OpherV

जवाबों:


5

6 महीने के दौरान जब से मैंने यह सवाल पूछा, मैंने इस सटीक मुद्दे (और कई अन्य!) से निपटने के लिए एक पूर्ण ओपन सोर्स गेम सर्वर विकसित किया है: http://lance.gg

यहाँ छवि विवरण दर्ज करें

आर एंड डी अब मुझे अपने सवालों के जवाब देने की अनुमति देता है:

  • क्या आप गैम्बेटा के एल्गोरिथ्म को निरंतर कदम आंदोलन के साथ काम कर सकते हैं? या यह मेरे खेल के साथ वैचारिक रूप से असंगत है?

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

  • क्या इसके बाद धीरे-धीरे प्रक्षेप करना सही तरीका है? यदि ऐसा है, तो आप क्लाइंट स्थिति से पहले से ही चलती ऑब्जेक्ट को कैसे मिलान करते हैं जो कि सर्वर से प्राप्त हुआ था?

    यह एक अलग विषय पर छूता है, जो सर्वर अपडेट का क्लाइंट सामंजस्य है। क्रमिक प्रक्षेप काम करता है, लेकिन प्रश्न में एक की तरह बहुत तेजी से पुस्तक खेल के लिए यह वास्तव में एक्सट्रपलेशन को लागू करने के लिए बेहतर है

  • क्या ये तरीके, क्रमिक प्रक्षेप और गैम्बेटा के एल्गोरिथम मिलकर काम कर सकते हैं या वे परस्पर अनन्य हैं?

    वे एक साथ काम कर सकते हैं, लेकिन केवल तब जब इकाई आंदोलन क्लाइंट POV से निर्धारक हो। यदि निकाय भौतिकी या पुसीडो-भौतिकी जैसे सम्मिलन, ड्रैग आदि से प्रभावित होता है तो यह काम नहीं करेगा।


1

आपका खेल समय कदमों के संदर्भ में सोचने के लिए बहुत "वास्तविक समय" लगता है। अगर खेल को "टर्न-बेस्ड" माना जा सकता है तो मैं केवल "टर्न" के संदर्भ में सोचूंगा। अन्यथा, बस मोड़ या कदम के विचार को छोड़ दें। सब कुछ आसान हो जाता है :)

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

उम्मीद है की यह मदद करेगा :)


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

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

@Tealr वास्तव में, यही कारण है कि मैंने "स्टेप" शब्द का उपयोग शुरू करने के लिए किया - मैं बस यह स्पष्ट करना चाहता था कि "स्टेप" का उपयोग टर्न-आधारित गेम्स तक सीमित नहीं है, और मेरे गेम में एक स्टेप बिल्कुल 1 लेता है। / 60 सेकंड की परवाह किए बिना।
ओपरवि

बस कुछ मैं अपने खुद के प्रयोग के लिए ध्यान दें: 1 / 60s। असामान्य रूप से तेज़ है और मैं दांव लगाऊंगा कि 1x1 से अधिक भागीदारी वाले अधिकांश ऑनलाइन गेम 1 / 10s पर काम करते हैं। अद्यतन या उपचार।
पैट्रिक ह्यूजेस 20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.