मैं एक 2 डी टॉप-डाउन-शूटर पर काम कर रहा हूं और क्वेक 3 जैसे नेटवर्क वाले गेम में उपयोग किए जाने वाले अवधारणाओं की प्रतिलिपि बनाने के लिए अपनी पूरी कोशिश कर रहा हूं।
- मेरे पास एक आधिकारिक सर्वर है।
- सर्वर ग्राहकों को स्नैपशॉट भेजता है।
- स्नैपशॉट में टाइमस्टैम्प और एंटिटी पोजीशन होते हैं।
- स्नैपशॉट स्थितियों के बीच संस्थाओं को प्रक्षेपित किया जाता है ताकि आंदोलन सुचारू दिखे।
- आवश्यकता के अनुसार, इकाई प्रक्षेप थोड़ा "अतीत में" होता है, ताकि हमारे पास कई स्नैपशॉट हों, जिनके बीच अंतर करना है।
मुझे जो समस्या आ रही है वह है "क्लॉक सिंक्रोनाइज़ेशन"।
- सादगी-खातिर, चलो बस एक पल के लिए दिखाते हैं कि पैकेट को सर्वर से और उसके पास स्थानांतरित करते समय शून्य विलंबता है।
- यदि क्लाइंट घड़ी क्लाइंट घड़ी से 60 सेकंड आगे है, तो एक स्नैपशॉट टाइमस्टैम्प ग्राहक स्थानीय टाइमस्टैम्प से 60000ms आगे होगा।
- इसलिए, ग्राहक को किसी भी दिए गए इकाई को अपनी चालें देखने से पहले, इकाई स्नैपशॉट लगभग 60 सेकंड के लिए इकट्ठा और बैठेगा, क्योंकि क्लाइंट घड़ी को पकड़ने में बहुत समय लगता है।
जब भी एक स्नैपशॉट प्राप्त होता है, मैं सर्वर और क्लाइंट घड़ी के बीच अंतर की गणना करके इसे दूर करने में कामयाब रहता हूं।
// For simplicity, don't worry about latency for now...
client_server_clock_delta = snapshot.server_timestamp - client_timestamp;
यह निर्धारित करते समय कि इकाई कितनी दूरी पर है, मैं केवल ग्राहक के वर्तमान समय में अंतर जोड़ता हूं। हालांकि, इसके साथ समस्या यह है कि यह झटके का कारण बनेगा क्योंकि स्नैपशॉट्स के दूसरों की तुलना में तेज / धीमी गति से आने के कारण दो घड़ियों के बीच का अंतर अचानक कम हो जाएगा।
मैं घड़ियों को कितनी बारीकी से सिंक्रनाइज़ कर सकता हूं कि एकमात्र विचारनीय देरी वह है जो प्रक्षेप के लिए कठिन-कोडित है, और जो सामान्य नेटवर्क विलंबता के कारण होता है?
दूसरे शब्दों में, मैं बहुत देर से या बहुत जल्द शुरू होने से प्रक्षेप को कैसे रोक सकता हूं जब घबराहट की शुरुआत किए बिना घड़ियों को काफी वंशानुगत किया जाता है?
संपादित करें: विकिपीडिया के अनुसार , एनटीपी का उपयोग कुछ मिलीसेकंड के भीतर इंटरनेट पर घड़ियों को सिंक्रनाइज़ करने के लिए किया जा सकता है। हालांकि, प्रोटोकॉल जटिल लगता है, और शायद गेम में उपयोग के लिए ओवरकिल?