गैर-निशानेबाजों के लिए आंदोलन की भविष्यवाणी


35

मैं मध्यम-स्तर के मल्टीप्लेयर के साथ एक आइसोमेट्रिक 2 डी गेम पर काम कर रहा हूं, लगभग 20-30 खिलाड़ी एक बार एक निरंतर सर्वर से जुड़े। मुझे जगह में एक अच्छा आंदोलन भविष्यवाणी कार्यान्वयन प्राप्त करने में कुछ कठिनाई हुई है।

भौतिकी / आंदोलन

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

मुख्य गेम लूप में, "ड्रा" से पहले "अपडेट" कहा जाता है। अद्यतन तर्क "भौतिकी अद्यतन कार्य" को चलाता है जो गैर-शून्य वेग के साथ सभी संस्थाओं को ट्रैक करता है, संस्थाओं की स्थिति को बदलने के लिए बहुत बुनियादी एकीकरण का उपयोग करता है। उदाहरण के लिए: unit.Position + = unit.Velocity.Scale (ElapsedTime.Seconds) (जहां "सेकंड" एक फ़्लोटिंग पॉइंट मान है, लेकिन वही दृष्टिकोण मिलीसेकंड पूर्णांक मानों के लिए काम करेगा)।

प्रमुख बिंदु यह है कि आंदोलन के लिए किसी भी प्रक्षेप का उपयोग नहीं किया जाता है - अल्पविकसित भौतिकी इंजन में "पिछले राज्य" या "वर्तमान स्थिति" की कोई अवधारणा नहीं है, केवल एक स्थिति और वेग है।

स्टेट चेंज एंड अपडेट पैकेट्स

जब चरित्र इकाई का वेग खिलाड़ी परिवर्तनों को नियंत्रित कर रहा होता है, तो एक "चाल अवतार" पैकेट को सर्वर पर भेजा जाता है जिसमें इकाई की क्रिया प्रकार (स्टैंड, वॉक, रन), दिशा (उत्तर-पूर्व), और वर्तमान स्थिति होती है। यह इस बात से अलग है कि 3D प्रथम व्यक्ति गेम कैसे काम करता है। एक 3 डी गेम में खिलाड़ी के चारों ओर घूमते समय वेग (दिशा) फ्रेम को फ्रेम में बदल सकता है। हर राज्य में बदलाव को प्रभावी ढंग से प्रति फ्रेम एक पैकेट प्रेषित किया जाएगा, जो बहुत महंगा होगा। इसके बजाय, 3 डी गेम राज्य परिवर्तनों को नजरअंदाज करते हैं और एक निश्चित अंतराल पर "राज्य अद्यतन" पैकेट भेजते हैं - कहते हैं, हर 80-150ms।

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

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

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

भविष्यवाणी और अंतराल मुआवजा

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

समस्या का

मैं विभिन्न एल्गोरिदम के साथ संघर्ष कर रहा हूं, और कई प्रश्न और समस्याएं हैं:

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

  2. जब एक पैकेट आता है, तो मैंने पैकेट की स्थिति को पैकेट के वेग के साथ एक निश्चित समय अवधि (जैसे, 200ms) पर प्रक्षेपित करने की कोशिश की है। फिर मैं एक नए वेक्टर की गणना करने के लिए प्रक्षेपित स्थिति और वर्तमान "त्रुटि" स्थिति के बीच का अंतर लेता हूं और उस इकाई पर वेग के बजाय जो भेजा गया था। हालाँकि, धारणा यह है कि उस समय के अंतराल में एक और पैकेट आ जाएगा, और अगले पैकेट के आने पर "अनुमान" करना अविश्वसनीय रूप से मुश्किल है - खासकर जब से वे सभी निश्चित अंतराल (यानी / साथ ही राज्य परिवर्तन) पर नहीं आते हैं। क्या अवधारणा मौलिक रूप से त्रुटिपूर्ण है, या यह सही है लेकिन कुछ सुधार / समायोजन की आवश्यकता है?

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

  4. संस्थाओं के टकरा जाने पर क्या होना चाहिए? तीन परिदृश्य हैं - नियंत्रित करने वाला खिलाड़ी स्थानीय रूप से टकराता है, दो इकाइयाँ स्थिति अद्यतन के दौरान सर्वर पर टकराती हैं, या एक दूरस्थ इकाई अद्यतन स्थानीय ग्राहक से टकराती है। सभी मामलों में मैं अनिश्चित हूं कि टकराव को कैसे संभालना है - धोखा देने से अलग, दोनों राज्य "सही" हैं, लेकिन अलग-अलग समय पर। एक दूरस्थ इकाई के मामले में यह एक दीवार के माध्यम से चलने को आकर्षित करने के लिए समझ में नहीं आता है, इसलिए मैं स्थानीय ग्राहक पर टकराव का पता लगाता हूं और इसे "बंद" करने का कारण बनता हूं। उपरोक्त बिंदु # 2 के आधार पर, मैं एक "सही वेक्टर" की गणना कर सकता हूं जो लगातार इकाई को "दीवार के माध्यम से" स्थानांतरित करने की कोशिश करता है जो कभी भी सफल नहीं होगा - जब तक कि त्रुटि बहुत अधिक न हो जाए, रिमोट अवतार वहां अटक जाता है और यह "स्नैप" में हो जाता है स्थान। खेल इसके आसपास कैसे काम करते हैं?


1
गेम का 3D या 2D होने का क्या मतलब है कि आप किस तरह के सर्वर का उपयोग करते हैं? और आपके खेल के लिए एथोरिटिव सर्वर काम क्यों नहीं करेगा?
अटैकिंगहोबो

1
@ रॉय टी। बैंडविड्थ ट्रेडऑफ़्स। बैंडविड्थ आज के कंप्यूटर सिस्टम में सबसे मूल्यवान संसाधन है।
FxIII

1
यह सिर्फ असत्य है, ऑनलाइन गेम काफी हद तक प्रतिक्रिया समय पर हावी हैं, उदाहरण के लिए 10Mbit लाइन (1.25MB / s) पर सर्वर-क्लाइंट के बीच विलंबता 20ms है, 1.25kb पैकेट भेजने पर 20ms + 1ms लगेंगे। 12.5kb का पैकेट भेजने पर 30ms लगेंगे। दो बार फास्ट लाइन के रूप में, एक 1.25kb पैकेट अभी भी 20ms + 0.5ms और 20ms + 5ms 12.kb पैकेट ले जाएगा। विलंबता सीमित कारक है, बैंडविड्थ नहीं । वैसे भी, मुझे नहीं पता कि कितना डेटा है, लेकिन 50 वेक्टर 3 (25x स्थिति + 25x रोटेशन) भेजना केवल 600 बाइट्स है, यह हर 20ms भेजने पर 30kb / s खर्च होंगे। (+ पैकेट ओवरहेड)।
रॉय टी।

2
पहले संस्करण के बाद से क्वेक इंजन की भविष्यवाणी है। वहाँ और कुछ अन्य स्थानों पर भूकंप की भविष्यवाणी वर्णित है । इसकी जांच - पड़ताल करें।
user712092

1
क्या आप इस स्थिति को समानांतर में प्रत्येक इकाई के लिए + = वेग * देरी करते हैं (अनिवार्य रूप से: कोड में आपके पास संस्थाओं के भौतिक मापदंडों के 2 सरणियाँ हैं, एक फ्रेम के अलावा, आप पुराने को नए सिरे से अपडेट करते हैं और उन्हें स्वैप करते हैं)? सीन बैरेट द्वारा पुनरावृति के साथ कुछ समस्याएं हैं , जिन्होंने चोर 1 इंजन का आधार बनाया
user712092

जवाबों:


3

कहने का मतलब सिर्फ इतना है कि 2 डी, आइसोमेट्रिक, 3 डी, वे सभी एक जैसे हैं जब यह समस्या आती है। क्योंकि आप 3 डी के कई उदाहरण देखते हैं और आप केवल तात्कालिक वेग के साथ 2 डी ओक्टेंट-सीमित इनपुट प्रणाली का उपयोग कर रहे हैं इसका मतलब यह नहीं है कि आप पिछले 20+ वर्षों में विकसित किए गए नेटवर्किंग सिद्धांतों को बाहर फेंक सकते हैं।

गेम खेलने से छेड़छाड़ होने पर डिजाइन सिद्धांतों को धिक्कारा जाता है!

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

उपरोक्त एक बड़ा कारण है कि सर्वर बहुत सी राज्य सूचनाएँ भेजते हैं और इनपुट नियंत्रित नहीं करते हैं। एक और बड़ा कारण इस बात पर आधारित है कि आप किस प्रोटोकॉल का उपयोग कर रहे हैं। UDP स्वीकार किए जाते हैं पैकेट हानि और ऑर्डर डिलीवरी से बाहर? सुनिश्चित डिलीवरी और रिट्रीज़ के साथ टीसीपी? किसी भी प्रोटोकॉल के साथ आप अजीब समय पर पैकेट प्राप्त करने जा रहे हैं, देरी या एक-दूसरे की गतिविधि की हड़बड़ाहट में ढेर पर। उन सभी अजीब पैकेटों को एक संदर्भ में फिट करने की आवश्यकता है ताकि ग्राहक यह पता लगा सके कि क्या चल रहा है।

अंत में, भले ही आपके इनपुट 8 दिशाओं तक सीमित हों लेकिन वास्तविक परिवर्तन किसी भी समय हो सकता है - 250ms चक्र लागू करने से बस त्वरित खिलाड़ियों को निराशा होगी। किसी भी सर्वर को संभालने के लिए 30 खिलाड़ी कुछ भी बड़ा नहीं है। यदि आप हजारों के बारे में बात कर रहे हैं ... तब भी उनमें से समूह कई बॉक्सन में विभाजित हैं, इसलिए व्यक्तिगत सर्वर केवल एक उचित भार ले जा रहे हैं।

क्या आपने कभी हॉक या बुलेट जैसे भौतिकी इंजन की रूपरेखा तैयार की है? वे वास्तव में काफी अनुकूलित हैं और बहुत तेजी से। आप मान सकते हैं कि एबीसी ऑपरेशन के जाल में गिर रहा है और धीमी गति से कुछ का अनुकूलन कर रहा है, जिसकी आवश्यकता नहीं है।


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

1

तो आपका सर्वर अनिवार्य रूप से एक "रेफरी" है? इस मामले में, मेरा मानना ​​है कि आपके क्लाइंट में सब कुछ निर्धारक होना चाहिए; आपको यह सुनिश्चित करने की आवश्यकता है कि प्रत्येक क्लाइंट पर सब कुछ हमेशा एक ही परिणाम देगा।

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

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

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

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


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

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

क्या आपने पहली बार सही स्थिति को t + 1 पर गलत स्थिति को एकीकृत करने से पहले t से t + 1 में सही स्थिति को एकीकृत करना सुनिश्चित किया ?
जोनाथन कॉननेल

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

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

0

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

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


-1

मेरा पहला सवाल यह होगा: एक मॉडल का उपयोग करने में क्या गलत है जहां सर्वर का अधिकार है? यह क्यों मायने रखता है कि पर्यावरण 2 डी या 3 डी है? यदि आपका सर्वर आधिकारिक था तो यह आपके धोखा संरक्षण को बहुत आसान बना देगा।

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

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

खिलाड़ी के रुकने पर क्या होना चाहिए? मैं सही स्थिति के लिए प्रक्षेपित नहीं कर सकता, क्योंकि अगर उनकी स्थिति बहुत आगे है तो उन्हें पीछे की ओर या किसी अन्य दिशा में चलने की आवश्यकता हो सकती है।

आपको प्रक्षेप करने की आवश्यकता क्यों है? आधिकारिक सर्वर को किसी भी गलत हरकत को ओवरराइड करना चाहिए।

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

ये ऐसी स्थितियां हैं जहां सर्वर और क्लाइंट के बीच संघर्ष होगा और इसलिए आपको क्लाइंट पर राज्यों को बनाए रखने की आवश्यकता है ताकि सर्वर किसी भी त्रुटि को ठीक कर सके।

जल्दी जवाब के लिए क्षमा करें, मैं सिर बंद करना होगा। इस लेख को पढ़ें , इसमें निशानेबाजों का उल्लेख है, लेकिन किसी भी गेम के लिए वास्तविक समय नेटवर्किंग की आवश्यकता है।


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

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

1
-1। आपने जो लिखा है वह केवल विषय पर स्पर्श करता है; अस्पष्ट लगता है। जब वे अनिवार्य रूप से "इस लंबे लेख को पढ़ते हैं", तो उत्तर उप-बराबर महसूस करते हैं, जबकि हाथ से लेख की उपयोगी जानकारी नहीं होती है।
अटैकिंगहोबो

1
@AttackingHobo मुझे आपसे सहमत होना होगा। मैंने उल्लेख किया है कि मैं जल्दी में था लेकिन यह कोई बहाना नहीं है। अगर मेरे पास समय नहीं होता तो बेहतर होता कि इसे अकेला छोड़ दूं। सबक सीखा।
ज्ञान उर्फ ​​गैरी ब्यन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.