2009-04-21 8 views
7

में सर्वर और क्लाइंट के बीच विलंबता कैसे प्राप्त करूं मैं एक गेम इंजन के लिए सी # सर्वर एप्लिकेशन पर काम कर रहा हूं जिसे मैं एक्शनस्क्रिप्ट 3 में लिख रहा हूं। मैं धोखाधड़ी को रोकने और सुनिश्चित करने के लिए एक आधिकारिक सर्वर मॉडल का उपयोग कर रहा हूं निष्पक्ष खेल। अब तक, सब कुछ अच्छी तरह से काम करता है:मैं सी #

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

बात यह है कि जब मैं सर्वर की गणना पर डिफ़ॉल्ट 20ms टिक विलंब का उपयोग करता हूं, जब क्लाइंट एक लंबी दूरी के लिए चलता है, तो यह बंद होने पर एक उल्लेखनीय झुकाव होता है। अगर मैं 22 एमएमएस में थोड़ी देर में देरी करता हूं, तो मेरे स्थानीय नेटवर्क पर सब कुछ बहुत आसानी से चलता है, लेकिन अन्य स्थानों में झुकाव अभी भी वहां है। थोड़ा प्रयोग करने के बाद, मैंने देखा कि अतिरिक्त देरी की आवश्यकता क्लाइंट और सर्वर के बीच विलंबता से काफी जुड़ी हुई है। मैंने इसे एक फार्मूला तक भी उबाला जो काफी अच्छी तरह से काम करेगा: देरी = 20 + (विलंबता/10)।

तो, मैं एक निश्चित ग्राहक और सर्वर (मैं एसिंक्रोनस सॉकेट का उपयोग कर रहा हूं) के बीच विलंबता प्राप्त करने के लिए कैसे कार्य करूंगा। सर्वर प्रयास धीरे-धीरे चलाने के लिए CPU प्रयास बहुत अधिक नहीं हो सकता है। साथ ही, क्या यह वास्तव में सबसे अच्छा तरीका है, या ऐसा करने के लिए एक और अधिक कुशल/आसान तरीका है?

उत्तर

12

क्षमा करें कि यह सीधे आपके प्रश्न का उत्तर नहीं दे रहा है, लेकिन आम तौर पर बोलते हुए आपको विलंबता को मापने पर बहुत अधिक भरोसा नहीं करना चाहिए क्योंकि यह काफी परिवर्तनीय हो सकता है । इतना ही नहीं, आप नहीं जानते कि आप जिस पिंग समय को मापते हैं वह सममित है, जो महत्वपूर्ण है। अगर यह पता चला कि 20ms का पिंग टाइम वास्तव में सर्वर से क्लाइंट और क्लाइंट से सर्वर तक 1ms है तो 10ms विलंबता सुधार लागू करने का कोई बिंदु नहीं है। और आवेदन शर्तों में विलंबता नेटवर्किंग शर्तों के समान नहीं है - आप एक निश्चित मशीन को पिंग करने और 20ms में प्रतिक्रिया प्राप्त करने में सक्षम हो सकते हैं, लेकिन यदि आप उस मशीन पर किसी सर्वर से संपर्क कर रहे हैं जो केवल नेटवर्क इनपुट को दूसरी बार 50 बार संसाधित करता है आपकी प्रतिक्रियाओं को अतिरिक्त 0 से 20ms तक देरी होगी, और यह बदले में अप्रत्याशित रूप से भिन्न होगा।

यह कहना नहीं है कि विलंबता माप में भविष्यवाणियों को सुलझाने में कोई जगह नहीं है, लेकिन यह आपकी समस्या को हल करने वाला नहीं है, बस इसे थोड़ा साफ करें।

इसके चेहरे पर, यहां समस्या यह है कि आपको पहले संदेश में जानकारी भेजी जाती है जिसका उपयोग आप अंतिम संदेश प्राप्त होने तक डेटा को निकालने के लिए करते हैं। यदि सब कुछ स्थिर रहता है तो संदेश के बीच के समय से गुणा किए गए पहले संदेश में दिए गए आंदोलन वेक्टर सर्वर को सही अंत स्थिति प्रदान करेगा जो क्लाइंट अब लगभग था- (विलंबता/2)। लेकिन अगर विलंबता बिल्कुल बदलती है, तो संदेश के बीच का समय बढ़ जाएगा या घट जाएगा। ग्राहक को पता चलेगा कि वह 10 इकाइयों को स्थानांतरित कर चुका है, लेकिन सर्वर ने उसे 10 इकाइयों को वापस खींचने के लिए कहा जाने से पहले 9 या 11 इकाइयों को आगे बढ़ाया।

इसका सामान्य समाधान यह नहीं मानना ​​है कि विलंबता स्थिर रहेगी लेकिन आवधिक स्थिति अपडेट भेजने के लिए, जो सर्वर को ग्राहक की स्थिति को सत्यापित और सही करने की अनुमति देती है। आपके पास अभी 2 संदेशों के साथ, दूसरी त्रुटि के बाद सभी त्रुटि मिलती है और सही होती है। अधिक संदेशों के साथ, त्रुटि अधिक सरल नमूना बिंदुओं पर फैली हुई है जो चिकनी और कम दिखाई देने वाली सुधार की अनुमति देती है।

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

+0

+1। –

2

एक "पिंग" कमांड है, जहां आप सर्वर से क्लाइंट को संदेश भेजते हैं, फिर प्रतिक्रिया प्राप्त करने में कितना समय लगता है। सीपीयू अधिभार परिदृश्य को छोड़कर, यह बहुत विश्वसनीय होना चाहिए। एक तरफा यात्रा का समय प्राप्त करने के लिए, बस समय को 2 से विभाजित करें।

+1

आवेदन के आधार पर, लगभग सभी संदेश 1518 या उससे अधिक तक के बिना पिंग सबपैकेट ले जा सकते हैं। इस तरह आप नेटवर्क मौसम बदलने के लिए स्वतः अनुकूलित कर सकते हैं। "ब्लैक आइंस्टीन" के लिए –

4

आप पहले से ही उपलब्ध Ping कक्षा का उपयोग कर सकते हैं। अपने स्वयं के IMHO लिखने पर प्राथमिकता दी जानी चाहिए।

4

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

नेटवर्क में Quality of Service (क्यूओएस) का बढ़ता उपयोग केवल इसे बढ़ाता है और इसके परिणामस्वरूप पिंग अभी भी एक उपयोगी उपकरण बना हुआ है, इसे समझने की जरूरत है कि यह गैर-आईसीएमपी के लिए नेटवर्क विलंबता का सही प्रतिबिंब नहीं हो सकता है आधारित वास्तविक यातायात।

इस बारे में इट्रिनेगी ब्लॉग How do you measure Latency (RTT) in a network these days? पर एक अच्छी पोस्ट है।