2009-09-11 14 views
31

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

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

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

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

+3

दिलचस्प सवाल। – Ian

+0

मेरा मानना ​​है कि आपको स्वीकृत उत्तर पर पुनर्विचार करना चाहिए। हेवनर्ड ने आज इस्तेमाल होने वाले मृत गणना या किसी भी अन्य अंतराल तकनीक के बारे में कुछ भी नहीं कहा। ऐसा नहीं है कि खेल सिर्फ घोषित करें "लापरवाही खिलाड़ियों को अपनी हालत स्वीकार करनी चाहिए"; वे गेम को और अधिक बजाने योग्य बनाने के लिए अंतराल को छिपाने का प्रयास करते हैं। आखिरकार, अगर मैंने एक ऐसा गेम खेला जहां लोग हर जगह कूद रहे थे और मैं मुश्किल से खेल नहीं पाया था, तो मैं उस खेल को बहुत जल्दी छोड़ दूंगा। – Ricket

उत्तर

16

यह करने के लिए बुनियादी दृष्टिकोण कुछ Dead Reckoning और इसके बारे में एक काफी अच्छा लेख यहां पाया जा सकता कहा जाता है। असल में यह एक पूर्वानुमान एल्गोरिदम है जहां सर्वर अपडेट के बीच के समय के लिए इकाइयों की स्थिति का आकलन किया जाएगा।

और अधिक उन्नत तरीके है कि इस अवधारणा पर निर्माण कर रहे हैं, लेकिन यह एक अच्छा प्रारंभिक बिंदु है।


भी कैसे इस स्रोत इंजन में नियंत्रित किया जाता है (पहले हाफ लाइफ खेल के लिए वाल्व के इंजन) here पाया जा सकता है का विवरण, सिद्धांत मूल रूप से एक ही है - जब तक कि सर्वर बताता है कि अन्यथा एक भविष्यवाणी का उपयोग एल्गोरिदम एक अपेक्षित पथ के साथ इकाई को स्थानांतरित करने के लिए - लेकिन यह आलेख उस प्रभाव को संभालता है जिस पर कुछ गहराई से कुछ शूट करने की कोशिश की जा रही है।

2

आपका सबसे अच्छा विकल्प भविष्य से ग्राहक को वापस परिवर्तन भेजने के लिए है, जिससे समय यह अन्य ग्राहकों अंतराल समस्या नहीं है कि के लिए करता है में एक ही बिंदु पर ग्राहक पर पहुंचने से है।

+0

यह एक स्पष्ट उत्तर है, लेकिन निश्चित रूप से ताज़ा करने के बाद इसे तेज करने से पहले लोगों को अपनी मशीन को उद्देश्य से बाधित करने की संभावित खामियां खुलती हैं? किसी और के सामने कार्रवाई करने का मौका ... .. – Ian

+3

पैकेट को समय पर वापस भेजना स्पष्ट उत्तर है? वाह ... – Martin

+0

डाउनवॉटेड, उत्तर समझ में नहीं आता है। – CiscoIPPhone

2

यदि ग्राहक घटनाओं दर सर्वर है जो हो रहा देखना उसे खिलााना, जो इसे करने का सामान्य तरीका है (मैंने अल्टीमा ऑनलाइन, कलऑनलाइन और वर्ल्ड ऑफ वार्कक्राफ्ट के प्रोटोकॉल के साथ काम किया है), तो इस क्षणिक 5 सेकेंड देरी से उन्हें केवल 5 सेकंड की घटनाओं को प्राप्त होगा मैं एक बार में देखता हूं और उन घटनाओं को वास्तव में तेज़ी से या तुरंत पास करता हूं, क्योंकि अन्य खिलाड़ी उसे आउटपुट में देरी होने पर बहुत कम दूरी के लिए "चलने" को देख सकते हैं। उसके बाद सब कुछ सामान्य रूप से बहता है।असल में, ग्राफिक और भौतिकी सामान्यीकरण को छोड़कर, मुझे इसे ठीक से सिंक्रनाइज़ करने के लिए कोई विशेष आवश्यकता नहीं दिखाई दे रही है, यह सिर्फ स्वयं को सिंक्रनाइज़ करता है।

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

आखिरकार, पिछड़े खिलाड़ियों को अपनी हालत स्वीकार करनी चाहिए, या अपने डॉन ईमूल को बंद करना होगा।

+0

तो आप कह रहे हैं कि मुझे अपने ग्राहक पर समय पर वापस जाना चाहिए और खेल की स्थिति को फिर से भरना चाहिए? कहो कि मेरे पास एक खिलाड़ी दक्षिण की ओर बढ़ रहा है। वह सर्वर से किसी भी शब्द के बिना सभी क्लाइंट मशीनों पर ऐसा करना जारी रखेगा। अगर किसी बिंदु पर वह उत्तर की ओर बढ़ना शुरू कर देता है, तो सभी ग्राहक अभी भी उसे दक्षिण में जाने के रूप में प्राप्त करेंगे जब तक कि वे नोटिस प्राप्त नहीं कर लेते, और एक बार ऐसा करने के बाद, उन्हें समय पर वापस जाना होगा और अपनी स्थिति को दोबारा शुरू करना होगा क्योंकि वह वास्तव में नहीं था हर समय दक्षिण चलती है। समय पर वापस जाने और पुनर्मूल्यांकन करना संभव नहीं है मुझे लगता है कि मैं विशिष्ट अंतराल –

+0

पर प्लेयर पूर्ण स्थिति भेज सकता हूं अब यह कैसे किया जाना चाहिए। इस आंदोलन इंटरपोलेशन की सीमा होनी चाहिए, वह कुछ कदम आगे लटकाएगा जब तक कि सर्वर अपने आंदोलनों के बारे में नई जानकारी के साथ अंतःस्थापित न हो। – Havenard

+0

कलऑनलाइन में यह समन्वय सुधार द्वारा किया जाता है, प्रत्येक चरण वह एक्स, वाई और जेड के लिए 3 हस्ताक्षरित बाइट्स के साथ दुनिया में प्लेयर xyz बिंदु अद्यतन करता है। अन्य क्लाइंट मॉडल मॉडल को अंतिम xyz बिंदु पर इंटरपोलेट करते हैं। इंटरपोलेशन को भी नए बदलावों के रूप में छोड़ दिया नहीं जाता है, यह सिर्फ उस पल से नए अंतिम xyz पर विचार करता है। – Havenard

5

वास्तविक समय में कई दृष्टिकोणों में सही सिंक्रनाइज़ेशन की गारंटी देने का कोई तरीका नहीं होगा - भौतिकी के नियम इसे असंभव बनाते हैं। अगर सूर्य अब विस्फोट हो गया है, तो आप कैसे गारंटी दे सकते हैं कि अल्फा सेंटौरी पर पर्यवेक्षकों ने सुपरनोवा को उसी समय देखा जब हम पृथ्वी पर होंगे? जानकारी यात्रा करने में समय लगता है।

इसलिए, आपके विकल्पों को या तो विलंबता के साथ सटीक रूप से मॉडल करना है जो दर्शकों से व्यूअर (जो वर्तमान में आपके पास है) से अलग हो सकता है, या बिना विलंबता के उन्हें गलत तरीके से मॉडल कर सकता है और व्यापक रूप से दर्शकों में सिंक्रनाइज़ किया जा सकता है (जहां भविष्यवाणी/मृत गणना/extrapolation आते हैं)। वास्तविक समय रणनीति जैसे धीमे गेम पहले मार्ग पर जाते हैं, तेज़ गेम दूसरे मार्ग पर जाते हैं।

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

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