प्रवेश करें कि आपके पास क्लाइंट और सर्वर के बीच 30ms की विलंबता है। ग्राहक भेज "मैं अपने रैकेट नीचे ले जाने चाहता हूँ" और उसके रैकेट 0.1px/एमएस के वेग
30ms सेकंड बाद साथ y = 100px पर है:
- ग्राहक रैकेट y = 100 पर है + 30 * 0.1 = 103px
- सर्वर क्लाइंट से आदेश प्राप्त करता है और
20ms सेकंड बाद रैकेट (जो सर्वर साइड पर y = 100px पर अभी भी वर्तमान में है) चलना शुरू:
- ग्राहक रैकेट y पर है = 103 + 20 * 0.1 = 105px
- सर्वर साइड ग्राहक रैकेट y पर है = 100 + 20 * 0.1 = 102px
- सर्वर क्लाइंट के लिए भेजता है नई स्थिति (102px)
30ms सेकंड बाद:
- ग्राहक rarcket y पर है = 105 + 30 * 0.1 = 108px
- क्लाइंट सर्वर से रैकेट के नए पद प्राप्त करता है : 102px
इस बिंदु पर, ग्राहक रैकेट 102px करने के लिए 108 से "कूदता" पिछड़े ...
कैसे नेटवर्क विलंबता से निपटने के लिए? दो पूरक तरीके:
- एक कार्रवाई
- भविष्यवाणी कार्यों का परिणाम (क्लाइंट और सर्वर पक्षों पर)
कर पहले aproach जब प्रभाव पर प्रयोग किया जाता है से पहले सर्वर acknowlegment का इंतजार ग्राहक शायद ही परिणाम से जुड़ा हुआ है और "रोलबैक" नहीं हो सकता है। उदाहरण: जब कोई क्लाइंट मिसाइल को गोली मारता है, तो यह एडमिट करने योग्य नहीं है कि इस मिसाइल को अगले अपडेट पर सर्वर द्वारा दबाया जा रहा है क्योंकि क्लाइंट वास्तव में मिसाइल स्टॉक नहीं था। तो इस मामले में, क्लाइंट एप्लिकेशन मिसाइल लॉन्च करेगा जब सर्वर ने एक स्वीकृति भेजी थी।
दूसरा सर्वर हमेशा सिंक होने पर इन "कूदता" से बचने के लिए उपयोग किया जाता है। आपको अपने गेम तत्वों की गति की भविष्यवाणी करने के लिए नेटवर्क विलंबता की निगरानी करनी होगी। यहां दो तरीके: पिंग की गणना करें या स्टार्टअप (सबसे आसान और अधिक मजबूत तरीका) पर सर्वर और क्लाइंट समय सिंक्रनाइज़ करें। सामान्य विचार है:
30ms बाद में चलना शुरू "मैं समय मेरे रैकेट नीचे ले जाने के = 1,265,871 चाहता हूँ": y = 100 पर
- ग्राहक रैकेट + 30 * 0.1 = 103 पीएक्स
- सर्वर 30 एमएम विलंबता (पिंग या समय सिंक अंतर द्वारा) को स्थानांतरित करता है और गणना करता है और रैकेट स्थिति y = 100 + विलंबता * 0.1 = 100 + 30 * 0.1 = 103px
पर सेट करता है
बिल्कुल सही! वे सिंक्रनाइज़ हैं। बाद में
20ms:
- सर्वर और ग्राहक दोनों y पर रैकेट = 103 + 20 * 0.1 = 105px
- सर्वर नई स्थिति और दिशा
30ms बाद में भेजता है:
- y = 105 + 30 * 0.1 = 108px
- क्लाइंट आर पर क्लाइंट रैकेट नई स्थिति और दिशा (105px नीचे जा) eceives, 30ms विलंबता की गणना करता है और y = 105 + विलंबता * 0.1 = 105 * 30 * 0.1 = 108px
फिर, क्लाइंट और सर्वर सिंक्रनाइज़ किए जाते हैं पर रैकेट स्थिति सेट!
जब ग्राहक पहले क्लाइंट को आगे बढ़ता है तो दूसरे ग्राहक पर Desync हो सकता है। इस मामले में खिलाड़ी रैकेट थोड़ा "कूद" जाएगा। जब यह महत्वपूर्ण नहीं है, तो इस संक्रमण को सुचारू बनाना संभव है।
आशा है कि इससे मदद मिलेगी।
"असंतोषजनक परिणाम" और "ऑब्जेक्ट्स को आगे और आगे बढ़ाना" का क्या मतलब है? – BlueCookie
यह आलेख इस प्रश्न के बाद दिखाई दिया: http://drewblaisdell.com/writing/game-networking-techniques-explained-with-pong/ – opyate