2010-09-20 18 views
12

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

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

लेकिन, समस्या यह है कि मुझे कार्यक्रम के दोहराए गए रनों पर अलग-अलग परिणाम मिल रहे हैं। 10 के प्रत्येक सेट के भीतर, प्रत्येक माप शायद ही कभी 400 मिलीसेकंड से अधिक हो जाता है, जो स्वीकार्य हो सकता है। लेकिन अगर मैं कार्यक्रम के प्रत्येक भाग के बीच कुछ मिनट इंतजार करता हूं, तो परिणामी औसत 2 सेकंड तक असहमत हो सकते हैं, जो स्वीकार्य नहीं है।

क्या दो नेटवर्क वाले उपकरणों की घड़ियों के बीच अंतर जानने का कोई बेहतर तरीका है? या क्या मेरे सटीक परिणामों को उत्पन्न करने के लिए मेरे एल्गोरिदम को ट्विक करने का कम से कम एक तरीका है?

विवरण जो प्रासंगिक हो सकता है या नहीं भी हो सकता है: डिवाइस आईपॉड टच ब्लूटूथ पर संचार कर रहे हैं। मैं पिंग्स को 50-200 मिलीसेकंड से कहीं भी माप रहा हूं। मैं उपयोगकर्ताओं को अपने घड़ियों को सिंक करने के लिए नहीं कह सकता। :)


अद्यतन: नीचे दिए गए उत्तरों की सहायता से, मैंने इसे संभालने के लिए एक उद्देश्य-सी कक्षा लिखी। मैंने इसे अपने ब्लॉग पर पोस्ट किया: http://scooops.blogspot.com/2010/09/timesync-was-time-sink.html

उत्तर

23

मैंने हाल ही में इस पर एक घंटे का कक्षा ली और यह काफी लंबा नहीं था, लेकिन मैं आपको सही दिशा में इंगित करने के लिए इसे उबालने की कोशिश करूंगा। थोड़ा बीजगणित के लिए तैयार हो जाओ।

सर्वर के अनुसार समय बराबर करते हैं। क्लाइंट के अनुसार समय के बराबर सी चलो। चलो डी = एस - सी। डी सर्वर के समय में इसे सही करने के लिए क्लाइंट के समय में क्या जोड़ा जाता है, और यही वह है जिसे हमें हल करने की आवश्यकता है।

सबसे पहले हम सर्वर से एक पैकेट को टाइमस्टैम्प के साथ क्लाइंट में भेजते हैं। जब ग्राहक पर वह पैकेट प्राप्त होता है, तो यह दिए गए टाइमस्टैम्प और इसकी घड़ी के बीच अंतर को टी 1 के रूप में संग्रहीत करता है।

क्लाइंट फिर अपने टाइमस्टैम्प के साथ सर्वर पर एक पैकेट भेजता है। सर्वर टाइमस्टैम्प और अपनी घड़ी के बीच अंतर को क्लाइंट को टी 2 के रूप में भेजता है।

ध्यान दें कि टी 1 और टी 2 दोनों में पैकेट के "यात्रा समय" टी और दो घड़ियों के बीच का समय अंतर शामिल है।पल कि यात्रा के समय दोनों दिशाओं में एक ही है के लिए मान लिया जाये कि, अब हम दो अज्ञात में दो समीकरण, जो हल किया जा सकता है:

t1 = t - d 
t2 = t + d 
t1 + d = t2 - d 
d = (t2 - t1)/2 

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

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

आशा है कि आपको सही दिशा में इंगित करने में मदद मिलेगी।

+0

वाह! धन्यवाद! यही वही है जो मैं ढूंढ रहा हूं। यह मेरे लिए पूरी तरह से स्पष्ट नहीं है, फिर भी यह मेरी मूल विधि से बेहतर क्यों है (हालांकि मुझे विश्वास है कि यह है), लेकिन जब मैं इसे आज़माता हूं तो मैं यहां वापस पोस्ट करूंगा। मुझे नहीं लगता कि मुझे गेमिंग सत्र में डी को समायोजित करने की आवश्यकता होगी, लेकिन अगर मुझे आवश्यकता हो तो इसे करना मुश्किल नहीं होगा। एक बार फिर धन्यवाद! – whooops

+0

यह वास्तव में अच्छी तरह से काम किया है। मैंने पाया कि यदि मैं हमेशा सबसे छोटा (यानी, सबसे नकारात्मक) टी 1 और टी 2 मान लेता हूं, तो यह सबसे छोटी चीजें लेने जैसा ही होता है, इसलिए यह सही ऑफसेट पर परिवर्तित होता है। मैं t1 = ग्राहक डाक टिकट है - सर्वर टिकट और t2 = सर्वर टिकट - ग्राहक टिकट इसके अलावा, मुझे पता चला है कि आईफोन सुंदर काफी बहाव! आधे घंटे के भीतर, दो उपकरणों के बीच वास्तविक ऑफसेट आधे सेकेंड तक बदल सकता है। मैंने इसे घड़ी कार्यक्रमों के साथ सत्यापित किया जो एनटीपी सर्वर से संपर्क करते हैं। – whooops

+0

खुशी है कि यह आपके लिए सहायक था। –

2

आपका एल्गोरिदम अधिक सटीक नहीं होगा जब तक आप कुछ सांख्यिकीय तरीकों का उपयोग नहीं कर सकते। सबसे पहले, 10 शायद पर्याप्त नहीं है। पहला और सरल परिवर्तन 100 पारगमन समय के नमूने इकट्ठा करना होगा और एक्स को सबसे लंबा और सबसे छोटा टॉस आउट करना होगा।

जोड़ने के लिए एक और चीज यह होगी कि दोनों ग्राहक प्रत्येक पैकेट में अपना टाइमस्टैम्प भेजेंगे। फिर आप यह भी गणना कर सकते हैं कि उनके घड़ियां कितनी अलग हैं और घड़ियों के बीच औसत अंतर की जांच करें।

आप विशेष रूप से एसटीएनपी और एनटीपी कार्यान्वयन पर भी जांच कर सकते हैं, क्योंकि ये प्रोटोकॉल इसे विशेष रूप से करते हैं।

+0

धन्यवाद। मुझे लगता है कि मैं ऊपर दिए गए उत्तर द्वारा दिए गए एल्गोरिदम का प्रयास करूंगा, और एकाधिक नमूनों का उपयोग करने पर आपकी सलाह लेगा। – whooops

संबंधित मुद्दे