मैं एक तेजी से पुस्तक भौतिकी खेल है कि एक टेबल हॉकी कर रहा हूँ। दो मैलेट और एक पक के साथ। खेल iphone / ipad पर चलता है और मैं GameCenter के माध्यम से मल्टीप्लेयर भाग कर रहा हूँ।
यह नेटवर्क सिस्टम कैसे काम करता है। क्लाइंट जो मैच को तारांकित करता है, उसे सर्वर के रूप में निपटाया जाएगा और जो मैच अनुरोध स्वीकार करता है वह क्लाइंट है।
'सर्वर' में भौतिकी चल रही है और प्रतिक्रिया तत्काल है और ग्राहक के पास भी अपनी भौतिकी चल रही है इसलिए यह संदेशों के आदान-प्रदान के बीच सहज है। मैं सर्वर के रूप में क्या करता हूं, क्या मैं क्लाइंट को अपना puck वेलोसिटी और मेरी पोजीशन भेजता हूं और क्लाइंट अपने puck वेलोसिटी / पोजिशन को सर्वर से सिंक करने के लिए एडजस्ट करता है। अन्यथा भौतिकी desynchronizes और इसे खराब कर देती है।
जब नेटवर्क विलंबता अच्छी होती है, तो 100 मिलीमीटर के परिणाम बहुत अच्छे होते हैं, मुझे क्लाइंट की तरफ एक स्मूथ खेलने योग्य गेम मिला और अजीब व्यवहार न्यूनतम है। समस्या तब होती है जब अंतराल 150 से 200 सेमी के आसपास होता है। उस स्थिति में, ऐसा होता है कि मेरे मुवक्किल ने पहले से ही एक किनारे और उल्टे दिशा की ओर इशारा किया था, लेकिन इसे सर्वर से एक विलंब संदेश प्राप्त होता है और यह गेंद के व्यवहार के लिए एक अजीब भावना पैदा करता है।
मैंने इसके बारे में कुछ बातें पढ़ी हैं:
सिंक्रनाइज़ेशन उदाहरण पर क्लिक करें
तो, मैं इसे कैसे हल कर सकता हूं? जहां तक मैंने सबसे अच्छा विकल्प पढ़ा है कि मुझे सर्वर / क्लाइंट पर एक टाइमस्टैम्प के साथ एक घड़ी सिंक्रनाइज़ेशन करना है ताकि जब मुझे मेरी घड़ी से संबंधित संदेश देरी से मिलें, तो मैं तब अनदेखा करूं और ग्राहकों को अनुकरण करने दूं काम। क्या आप लोग इससे सहमत हैं? और चूंकि im अविश्वसनीय डेटा (UDP) भेज रहा है, इसलिए मुझे विलंबित संदेश या संदेश ऑर्डर से बाहर हो सकते हैं।
यदि वह सबसे अच्छा तरीका है, तो मैं घड़ी के सिंक्रनाइज़ेशन को कैसे लागू करूं। मैंने इस बारे में स्टेप्स पढ़े हैं कि मैं इसे कैसे समझ पाया।
इससे लगता है:
- क्लाइंट एक "समय अनुरोध" पैकेट पर वर्तमान स्थानीय समय टिकट और सर्वर को भेजता है।
- सर्वर द्वारा रिसीव करने पर, सर्वर स्टैम्प सर्वर-टाइम और रिटर्न देता है
- ग्राहक द्वारा प्राप्त होने पर, ग्राहक भेजे गए समय से वर्तमान समय को घटाता है और विलंबता की गणना करने के लिए दो से विभाजित करता है। यह क्लाइंट-सर्वर टाइम डेल्टा निर्धारित करने के लिए सर्वर समय से वर्तमान समय को घटाता है और सही घड़ी डेल्टा प्राप्त करने के लिए अर्ध-विलंबता में जोड़ता है। (अब तक यह अल्गोथिम एसएनटीपी के समान है)
- क्लाइंट हर बार कुछ सेकंड रोकते हुए, स्टेप्स को 3 पांच या अधिक बार 1 से दोहराता है। अंतरिम में अन्य ट्रैफ़िक की अनुमति दी जा सकती है, लेकिन सर्वोत्तम परिणामों के लिए इसे कम से कम किया जाना चाहिए। पैकेट प्राप्तियों के परिणाम सबसे कम-विलंबता क्रम में सबसे कम-विलंबता क्रम में संचित और क्रमबद्ध होते हैं। माध्यीय विलंबता इस आदेशित सूची से मध्य-बिंदु नमूना चुनकर निर्धारित की जाती है।
- माध्यिका से लगभग 1 मानक-विचलन से ऊपर के सभी नमूनों को छोड़ दिया जाता है और शेष नमूनों को एक अंकगणितीय माध्य का उपयोग करके औसत किया जाता है।
इस उदाहरण के बाद मेरे पास यह होगा:
चलो नाटक करते हैं खेल लोड हो गया है और मेरे ग्राहक का समय अभी 0 है, इसलिए मैं सर्वर को भेजता हूं कि मेरा समय 0 है।
संदेशों को सर्वर पर लाने के लिए 150ms लगते हैं लेकिन सर्वर की घड़ी पहले ही शुरू हो चुकी थी और क्लाइंट से 1 सेकंड आगे है। जब सर्वर को संदेश मिलता है तो समय होगा: 1.15 और उस समय को क्लाइंट को भेजता है, क्या हम अच्छे हैं? हमारे बहाने 150 लीटर पर स्थिर है दिखावा करते हैं।
अब ग्राहक समय 1.15 प्राप्त करता है और भेजे गए समय से वर्तमान समय को घटाता है और विलंबता की गणना करने के लिए दो से विभाजित करता है। विच है: 0.3 - 0 = 0.3 / 2 -> 150ms।
यह क्लाइंट-सर्वर टाइम डेल्टा निर्धारित करने के लिए सर्वर समय से वर्तमान समय को घटाता है और सही घड़ी डेल्टा प्राप्त करने के लिए अर्ध-विलंबता में जोड़ता है:
क्लाइंट समय: 0.3 सर्वर समय 1.15
0.3 - 1.15 = .85 + विलंबता (.15) = 1
यह कैसे सिंक्रनाइज़ है? मैं क्या खो रहा हूँ?
यह मल्टीप्लेयर और नेटवर्क अनुभव पर मेरा पहली बार है, इसलिए मैं थोड़ा भ्रमित हूं।
धन्यवाद।