2011-08-20 12 views
5

में ऑनलाइन गेम में एकाधिक-उपयोगकर्ता डेटा को समन्वयित करने के लिए डिज़ाइन पैटर्न सुझाव मैं node.js सीखने के लिए एक प्रोजेक्ट पर काम कर रहा हूं, और रीयल-टाइम में उपयोगकर्ता डेटा को समन्वयित करने के तरीके के बारे में कुछ सुझाव ढूंढ रहा था ।रीयल-टाइम

कहें कि आपके पास 2 डी आयताकार मानचित्र (लगभग 600x400) है, जिसमें उस मानचित्र पर एक्स, वाई स्थितियों पर कब्जा करने वाले कई खिलाड़ी हैं। प्रत्येक उपयोगकर्ता तीर कुंजी के साथ चारों ओर नेविगेट कर सकता है और कुछ बुनियादी तरीकों से दूसरों के साथ बातचीत कर सकता है। यह देखते हुए कि यह HTTP पर खेला जाएगा, सबसे आसान, स्नैपएस्ट अनुभव देने के लिए उपयोगकर्ता डेटा को संभालने और समन्वयित करने के मामले में सबसे अच्छा डिज़ाइन पैटर्न क्या होगा?

मैं कई विकल्प के बारे में सोच सकते हैं, लेकिन कुछ और अधिक विचार/स्पष्टीकरण की सराहना करेंगे:

  1. क्लाइंट सर्वर से स्थितीय डेटा भेजता है, सर्वर सभी ग्राहकों के लिए सभी पदों वितरित करता है, स्क्रीन परिणाम के साथ प्रदान की गई है। दोहराएँ। नकारात्मकता यह होगी कि क्लाइंट साइड डेटा राउंड-ट्रिप के समय तक लगी हुई है, लेकिन उलझन यह है कि वे सभी उपयोगकर्ताओं के साथ समन्वयित होते हैं।

  2. क्लाइंट प्रस्तुत करता है जहां यह सोचता है कि यह लगातार होता है, सर्वर पर स्थितित्मक डेटा भेजता है, सर्वर सभी ग्राहकों को सभी पदों को वितरित करता है, और उसके बाद क्लाइंट डेटा से स्क्रीन प्रतिपादन सर्वर डेटा के साथ ठीक किया जाता है। ऊपर एक स्नैपियर प्रतिक्रिया है, नकारात्मक पक्ष सिंक का मामूली नुकसान है।

  3. दोनों का मिश्रण, लेकिन (x, y) समन्वय का उपयोग करने के बजाय हम [पिछले x/y और समय, वर्तमान x/y और समय के एक वेक्टर का उपयोग करते हैं, समय अंतराल पर x/y का सुझाव दिया ] जिसका उपयोग तब प्रोजेक्टाइल पथों को आकर्षित करने के लिए किया जा सकता है जो लगातार बदलते हैं। ऐसा लगता है कि इसे लागू करना मुश्किल होगा।

कोई बात नहीं?

+0

संचार के लिए socket.io का उपयोग करें – Alfred

उत्तर

5

अधिकांश गेम डेड रेकोनिंग http://en.wikipedia.org/wiki/Dead_reckoning के कुछ रूपों का उपयोग करते हैं जो सर्वर से वितरित विलंबित अपडेट की अनुमति देता है लेकिन क्लाइंट पर वास्तविक समय अपडेट के कुछ भ्रम को बरकरार रखता है।

सबसे अच्छा विकल्प 3. यह विशेष रूप से जटिल नहीं है - बस ट्रैक करें कि आप प्रत्येक अभिनेता को गेम के यांत्रिकी पर आधारित होने की उम्मीद करते हैं, और जब आप सर्वर से अपडेट प्राप्त करते हैं तो आप दो राज्यों को समय के साथ लाइन में लाते हैं ।

यदि आपको लगता है कि सर्वर आपको एक राज्य भेजता है जो राज्य से बहुत दूर है तो आपका ग्राहक मान रहा है (बहुत दूर परिभाषित करने की आवश्यकता है) तो आप बस सर्वर स्थिति पर जा सकते हैं और ग्राहक पर असंतोष स्वीकार कर सकते हैं।

+0

हाँ, मैं वही करता हूं। आपके डेटा ट्रांसफर प्रारूप के आधार पर, असंतोष शायद ही कभी ध्यान देने योग्य होगा। कृपया मुझे बताएं कि आप सॉकेट का उपयोग कर रहे हैं और मतदान नहीं कर रहे हैं ... – landons

+0

यदि आप socket.io का उपयोग कर रहे हैं, तो भी आप अधिकांश उपयोगकर्ताओं के लिए मतदान पर भरोसा कर रहे हैं, websockets केवल कुछ हद तक ब्राउज़र एटीएम पर सक्षम हैं। –

+0

@ रिकार्डो: वेबसाइट्स (http://caniuse.com/websockets) और सर्वर से भेजे गए ईवेंट (http://caniuse.com/eventsource) का उपयोग करके वह मतदान के बिना अधिकांश ग्राहकों को डेटा धक्का दे पाएगा - केवल आईई उपयोगकर्ता मतदान का उपयोग करना होगा। –

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