सर्वर-साइड इनपुट


9

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

यह आम तौर पर अच्छी तरह से काम करता है, एक बड़ी समस्या को छोड़कर: किनारों से गिरना। मूल रूप से, यदि कोई खिलाड़ी एक किनारे की ओर चल रहा है, तो एक चट्टान का कहना है, और किनारे से जाने से ठीक पहले रुक जाता है, कभी-कभी एक दूसरे के बाद, वह किनारे से टेलीपोर्ट हो जाएगा। ऐसा इसलिए है क्योंकि सर्वर द्वारा सूचनाओं को संसाधित करने के बाद "मैंने W को दबाया" पैकेट भेजा जाता है।

यहाँ मेरा मतलब समझने में आपकी मदद करने के लिए एक लैग आरेख है: http://i.imgur.com/Prr8K.png

मैं बस एक "डब्ल्यू प्रेस" पैकेट को भेजने के लिए सर्वर के लिए प्रत्येक फ्रेम भेज सकता था, लेकिन यह एक बैंडविड्थ-महंगा समाधान प्रतीत होगा।

किसी भी मदद की सराहना की है!

जवाबों:


5

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

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

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

मुझे लगता है कि ऐसा होना चाहिए

client sends a move + position update
server gets it t+latency time later
server verifies and sends out info to all clients
client receives this at (t+latency + latency)

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


ग्राहक अपनी स्थिति बिल्कुल नहीं भेजता है; यह बस भविष्यवाणी / प्रक्षेप करता है। इसलिए यह किनारों से गिरता है जब उसे लगता है कि यह किनारे पर है। इसके अलावा, मैं यह नहीं देखता कि मैंने कहाँ कहा था कि लैग 1 सेकंड था, यह 8ms (स्थानीय परीक्षण) से 100ms (इंटरनेट पर) की तरह है। मैंने कहा कि खिलाड़ी बाद में सेट हो रहा था क्योंकि मैं समय-समय पर पूर्ण स्थिति अपडेट भेजता हूं। क्या मैं यह समझने में सही हूं कि मुझे उस स्थिति को भेजना चाहिए जो क्लाइंट को लगता है कि यह होना चाहिए, साथ ही उन कुंजियों को दबाया जाना चाहिए, और सर्वर को यह सत्यापित करना चाहिए कि यह संभव है?
थॉमस

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

हालांकि यह अभी भी खिलाड़ी को सर्वर पर किनारे से गिरने का कारण नहीं बना सकता है? जब तक मैं प्रत्येक फ्रेम को एक पैकेट नहीं भेजता, तब तक सर्वर यह सोच सकता था कि खिलाड़ी लगभग 32ms के लिए घूम रहा है। (मैं केवल हर तीन फ्रेम पैकेट भेजती हूं)। या आप यह सुझाव दे रहे हैं कि मैं सर्वर पर इनपुट का अनुकरण बिल्कुल नहीं करता, बल्कि केवल यह जाँचता है कि क्या स्थिति इनपुट के सीमा में है?
थॉमस

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

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

0

मैं आपको इस प्रश्न के रूप में समझता हूं:

जब मैं अंत में 'फॉरवर्ड' बटन दबाता हूं तो सर्वर को एक पैकेट मिलता है। इसलिए सर्वर पर वास्तविक आंदोलन वास्तविक खेल बनाम लगभग 100 मिलीसेकंड 'बहुत देर से' शुरू होता है और खिलाड़ी-ग्राहक की तरफ से व्यक्त होता है। इसलिए यदि खिलाड़ी 10 सेकंड आगे बढ़ना चाहता है, तो वह x >= 1ऑनलाइन के बजाय 10.x सेकंड के लिए कदम बढ़ा सकता है ।

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

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

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

तो मूल रूप से आपको एक पैकेट भेजने की आवश्यकता होगी कि कौन सा बटन दबाया गया है और वास्तविक खेल समय क्या था बटन दबाया गया था और फिर बाद में, कौन सा बटन जारी किया गया था और किस सटीक समय पर।


जैसा कि मैंने पैट्रिक से कहा, मुझे लगता है कि समाधान एक हेयुरिस्टिक दृष्टिकोण से अधिक होगा; सर्वर "द मैन" होने के बजाय, सर्वर वैधता के लिए क्लाइंट डेटा की जांच करता है। यह निश्चित रूप से, कुछ लेवे का निर्माण करना होगा ताकि लैग या अन्य नेटवर्क मुद्दे झूठी सकारात्मकता पैदा न करें।
थॉमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.