2012-10-19 11 views
7

हाय मैं node.js और socket.io का उपयोग कर रीयलटाइम मल्टीप्लेयर गेम बनाने की कोशिश कर रहा हूं।node.js/socket.io का उपयोग कर रीयलटाइम बड़े पैमाने पर मल्टीप्लेयर गेम बनाने में कितना महंगा है?

अब, कोडिंग के मामले में स्वयं को लागू करना कोई समस्या नहीं होगी, लेकिन पारंपरिक http अनुरोध-प्रतिक्रिया वेब प्रोग्रामिंग मॉडल से आ रहा है, मुझे नहीं पता कि यह यातायात और सर्वर के मामले में कितना महंगा होगा भार। असल में एक गेम के दौरान, एक खिलाड़ी के ब्राउज़र को रीयलटाइम माउस इनपुट इवेंट ट्रैक करना चाहिए और उन्हें उसी गेम में अन्य सभी खिलाड़ियों को प्रसारित करना चाहिए।

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

// client side 
$(document).on("mousemove", function(event){ 
    io.emit("coordinate", {x: event.pageX, y: event.pageY}); 
}); 

और सर्वर पर:

// server side 
io.sockets.on("connection", function(socket){ 
    ... 
    socket.on("coordinate", function(coordinate){ 
     socket.get("username", function(err, username){ 
      socket.broadcast.emit("move", {username: username, coordinate:coordinate}); 
     }); 
    }); 
    ... 
}); 

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

[संपादित करें] स्पष्ट करने के लिए, मैं इस वास्तुकला को और अधिक कुशल बनाने के तरीके के बारे में नहीं पूछ रहा हूं। मैं सिर्फ यह जानना चाहता हूं कि इस प्रकार की प्रणाली सिस्टम लोड (और रखरखाव लागत) के मामले में पर्याप्त यथार्थवादी है, सामान्य वेब सेवाओं के लिए मैं केवल पृष्ठ दृश्य संख्याओं को देखकर लागत का अनुमान लगा सकता हूं लेकिन वेबस्केट एक बिल्कुल नया क्षेत्र है, मुझे पता नहीं है के, तो मैं पूछना चाहता था।

उत्तर

5

चेतावनी: नीचे दी गई सभी संख्याएं अनुमानित हैं और कुछ अच्छे स्थानों में ओवरहेड्स हैं लेकिन आपको शुरू करने के लिए कहीं और देना चाहिए।

यदि आप जो भी कर रहे हैं, वह कनेक्शन के बीच डेटा को आगे और आगे दबा रहा है तो ऐसा लगता है कि सर्वर आपकी बाधा बन जाएगा। मुझे लगता है कि आप बैंडविड्थ (प्लेयर एंड एंड/या डेटा सेंटर एंड पर) के साथ अपनी पहली दीवार हिट करेंगे।

मानते हुए कि प्रत्येक उपयोगकर्ता माउस डेटा प्रति सेकंड25 बार के एक औसत इसका मतलब है कि हर एक खिलाड़ियों x 25 प्रति सेकंड डाउनलोड हो जाएगा धक्का है। मान लें कि प्रत्येक माउस आंदोलन संदेश 100 बाइट्स है और 20 खिलाड़ी का अर्थ है कि आप ~ 50kb प्रति सेकंड डाउनलोड कर रहे हैं, जो काफी अधिक है लेकिन प्राप्त करने योग्य है। मैं मूर्खता से कहता हूं क्योंकि उपरांत होंगे, लेकिन एक सभ्य कनेक्शन के साथ यह प्राप्त करने योग्य लगता है।

डाउनलोड बैंडविड्थ, खिलाड़ियों की संख्या के साथ रैखिक है तो 100 खिलाड़ियों में इस तरह के और 22MB/एस 250kb/s और ग्राहक अंत में सर्वर अंत पर होगी।

यदि आपको अधिक खिलाड़ियों की आवश्यकता है तो आपको अनुकूलन ढूंढने की आवश्यकता होगी, उदा। संदेश, डेटा संपीड़न ट्रिमिंग, माउस नमूना गति को सीमित करने, आदि

1

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

यह अभी भी कितने ऑब्जेक्ट्स और खिलाड़ियों को प्रबंधित करने की आवश्यकता है, इस संदर्भ में सीमाएं हैं लेकिन सर्वर कई अवतारों और वस्तुओं के लिए एक दूसरे मूल्य के 1/10 या 1/4 एकत्र कर सकता है और उन्हें साझा कर सकता है एक बंडल के रूप में बाहर नेटवर्क, सर्वर, और ग्राहक लोड को कम करने।

+0

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

3

दस लाख डॉलर का सवाल यह है: I just want to know if this type of system is realistic enough in terms of system load (and maintenance cost)। मुझे लगता है कि यह बहुत सापेक्ष है। कोडिंग, हार्डवेयर, उपयोगकर्ताओं की मात्रा के सापेक्ष।

लियोन का सुझाव अच्छा है, केवल माउस क्लिक को ट्रैक करें और माउस चाल को ट्रैक न करें। इस तरह के खेल में, अनुरोध/प्रतिक्रियाओं को कम करने के लिए हर रणनीति का स्वागत है।

आपके प्रश्न का उत्तर देते हुए, मैंने फिर से कहा, यह सापेक्ष है, आपकी शुरुआत (नोड.जेएस और websockets का उपयोग करके) अच्छा लगता है, और यह 1.000 उपयोगकर्ता sumultaneosly के लिए काम कर सकता है, लेकिन 1.000.000 के लिए काम नहीं कर सका, हालांकि, एक बेहतर हार्डवेयर के साथ एक ही कोड, 1.000, 1.000.000, 1.000.000.000 उपयोगकर्ताओं के लिए काम कर सकता है, यह एक बुनियादी ढांचा सवाल है। मुझे लगता है कि प्रिंसिस be carefully in your code to mantain the system lightwheigt है, क्योंकि यदि आपको पता है कि आपका कोड अच्छा है, तो समस्या हार्डवेयर, बैंडविड्थ इत्यादि होगी (और आप बाद में इसकी देखभाल कर सकते हैं।)

1

मैं बहुत कुछ इसी तरह किया है ...

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

अपने गेम के साथ शुभकामनाएँ!

दान

पुनश्च - याद रखें, आप गति के लिए डिजाइन करने के लिए है!

1

इस तरह से विचार करें।

आप वास्तव में, वास्तविक समय अद्यतन के साथ एक बड़े पैमाने पर मल्टीप्लेयर गेम बनाने के लिए तो stats यहाँ के अनुसार चाहते हैं, आपका सर्वश्रेष्ठ दांव अगर WebSockets। (socket.io एक सुविधाजनक लाइब्रेरी है जो फॉलबैक प्रदान करती है, लेकिन इसे मुख्य रूप से websockets का उपयोग करने के लिए कॉन्फ़िगर किया जाना चाहिए।)

रिचर्ड ने कुछ ठोस अनुमान किए।

  • खुला कनेक्शन की अधिकतम संख्या (ulimit के लिए गूगल)
  • बनता है (Node.js किसी एकल थ्रेड पर चलता है, और यह शायद में कभी नहीं बदलेगा: हालांकि, वहाँ दो अतिरिक्त चीजें आप पर विचार करने की जरूरत है भविष्य; आपके परिवर्तनों को प्रसारित करते समय, लगभग (ओ) प्रदर्शन आपके गेम के लिए स्वीकार्य होगा?)
संबंधित मुद्दे