रियल टाइम एफपीएस गेम में सर्वर को क्या भेजें?


23

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

निविष्टियाँ भेजने के साथ: यदि खिलाड़ी दिशा कुंजियों को पकड़े हुए है तो मुझे क्या करना चाहिए? इसका मतलब है कि मुझे सर्वर को हर फ्रेम में एक पैकेज भेजने की आवश्यकता है। क्या यह बहुत ज्यादा नहीं है? और माउस इनपुट से खिलाड़ी का रोटेशन भी होता है। यहाँ एक उदाहरण है:

http://www.gabrielgambetta.com/fpm_live.html

निश्चित अंतराल दृष्टिकोण में स्थिति भेजने के बारे में क्या। यह सर्वर पर बहुत कम संदेश भेजता है। लेकिन यह जवाबदेही को भी कम करता है।

तो कौन सा तरीका बेहतर है?

जवाबों:


19

सरल उत्तर: धोखा या वह सटीक नहीं है!

यदि आपने कुछ शूटर ऑनलाइन खेले हैं, तो आपको सबसे अधिक तथाकथित "रबर बैंडिंग" का अनुभव होगा यदि सर्वर से आपका कनेक्शन खराब है।

यह आपके क्लाइंट द्वारा समय-समय पर आपकी स्थिति को सही करने के कारण होता है।

असल में, दो पक्षों में क्या होता है:

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

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

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

तो हाँ, आपका निश्चित अंतराल दृष्टिकोण सबसे अधिक संभावना काम करेगा और पर्याप्त होगा।

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


5
हां, मैं बटन के प्रेस और रिलीज को ट्रैक कर सकता हूं। लेकिन माउस इनपुट के बारे में क्या? यह लगातार बदल रहा है।
सिलोक

6
"इसके बजाय, बटन दबाए जाने पर एक घटना भेजें और एक बार बटन जारी होने के बाद।" - सच है, लेकिन गेम के नियमों के आधार पर यह सुनिश्चित करने के लिए कि "रिलीज पर" घटना अंततः मजबूर है, चेक की आवश्यकता है। उदाहरण के लिए, रेनबो सिक्स वेगास 2 मल्टीप्लेयर में, एक खिलाड़ी अपनी बंदूक से फायरिंग शुरू कर सकता है, और एक (दुर्भाग्य से आम) बग "स्टॉप फायरिंग" संदेश का कारण बनता है ताकि सर्वर तक सफलतापूर्वक न पहुंच सके। यह बंदूक की गोली के ऑडियो में शेष मैच के लिए एक अनंत लूप में रहता है। सिर्फ एक उदाहरण से सावधान रहना। youtu.be/GOQIbLCy7m8?t=9m10s
माइक बैक्सटर

@ साइलोक: बस इसे क्लाइंट साइड हैंडल करें और सर्वर को यह निर्धारित करने दें कि क्या आंदोलन वैध / संभव है (टेलीपोर्ट हैक और इसी तरह के सामान को रोकने के लिए)।
मारियो

@ सिलोक बस माउस के लिए एक अंतराल सेट करें, लेकिन अतिरिक्त बैंडविड्थ को बचाने के लिए क्लाइंट-साइड चेकिंग करने के लिए देखें कि क्या यह बदल गया है। यदि कोई माउस आंदोलन नहीं है, तो आपको इसके बारे में संदेश भेजने की आवश्यकता नहीं है।
अगस्त १।

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

5

यदि आप पहले से नहीं हैं, तो मैं आपको इन दो गहरे लेकिन समझ में आने वाले लेखों को पढ़ने का सुझाव देता हूं: https://developer.valvesoftware.com/wiki/Source_Multeps_Networking और http://fabiensanglard.net/quake3/network.php

ये समझाते हैं कि क्यों 'निश्चित अंतराल' पैकेट भेजने का उपयोग करने की सलाह दी जाती है। संक्षिप्त रूप से, यह वास्तव में सर्वर द्वारा भेजे गए पैकेट के लिए महत्वपूर्ण है।

एक पैकेट भेजने की एक निश्चित लागत है, और एक नेटवर्क पैकेट अधिकतम आकार लगभग 1.5 KB है। इसलिए यदि आपके पास अपने सर्वर पर उदाहरण के लिए 16 खिलाड़ी हैं, तो प्रत्येक फ्रेम जब आप एक खिलाड़ी के लिए आंदोलन की गणना करते हैं, तो भोले कोड प्रत्येक आंदोलन संकल्प के बाद प्रत्येक खिलाड़ी को एक अपडेट पैकेट भेज सकते हैं, इसलिए 16 * 16 = 256 पैकेट। यदि आपके पास 30 का फ्रैमरेट है, तो वह 7680 पैकेट है।

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

अब आप एक ही परिणाम के लिए सेकंड के द्वारा केवल 480 पैकेट भेजते हैं।

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

आपके प्रश्न के दूसरे भाग के बारे में - जिस तरह से मैं लैग सनसनी को कम करने के लिए चुनता हूं वह यह जानकारी प्रत्येक फ्रेम पर सर्वर को भेजना था:

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

  • 1 सेकंड में अनुमानित खिलाड़ी की स्थिति: ग्राहक द्वारा गणना की जाती है: यदि खिलाड़ी माउस दिशा नहीं बदलता है और 1 सेकंड के लिए अपने वर्तमान स्थिति में कीबोर्ड छोड़ देता है तो खिलाड़ी कहां होगा? (हम टकरावों की परवाह नहीं करते हैं) यदि खिलाड़ी नहीं चल रहा है, तो 1 सेकंड में उसकी अनुमानित स्थिति इसकी वर्तमान स्थिति है।

  • वह जिस स्थिति को देखता है।

हर बार सर्वर को यह जानकारी प्राप्त होती है कि यह भविष्य की स्थिति और देखी गई स्थिति को अपडेट करता है, और खिलाड़ी इकाई अंततः अपने भविष्य की स्थिति की ओर बढ़ती है।

खिलाड़ी कभी भी सिंक्रनाइज़ नहीं होते हैं, लेकिन इनपुट प्रतिक्रिया तुरंत (मेरे लिए सबसे महत्वपूर्ण) है और मैंने भविष्यवाणी की कि पदों को मेरे लिए पर्याप्त सटीक होना चाहिए।


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

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