2011-11-17 13 views
31

मुझे क्लाइंट के लिए एचटीएमएल 5/जावास्क्रिप्ट और शायद सर्वर सॉफ़्टवेयर के लिए जावा का उपयोग करके एक छोटा सा वास्तविक समय मल्टीप्लेयर गेम बनाने में दिलचस्पी है।क्या रीयल-टाइम मल्टीप्लेयर गेम के लिए वेबसाकेट उपयुक्त हैं?

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

संबंधित विषय पर, इस उद्देश्य के लिए वेबस्केट्स के लिए कोई बेहतर विकल्प हैं (जावास्क्रिप्ट में रीयल-टाइम मल्टीप्लेयर गेम)?

+2

वास्तव में प्रत्येक संचरण में केवल दो बाइट ओवरहेड होते हैं। Http हैंडशेकिंग केवल तब होती है जब एक नई वेबस्केट खोलते हैं और जब तक ब्राउजर उस पृष्ठ पर रहता है तब तक आप वेबस्केट को तब तक खोल सकते हैं। –

+1

हां, वे हैं। सॉकेट खोलने के लिए एक बार HTTP हैंडशेक किया जाता है। तो अगर आप एक संदेश के बाद सॉकेट बंद करते हैं तो ओवरहेड बड़ा होता है, और यदि आप सॉकेट को हमेशा के लिए खोलते हैं तो महत्वहीन होता है। – Raynos

+0

हैंडशेकिंग प्रक्रिया इतनी जटिल क्यों है? जो मुझे याद है, उसे एक मुट्ठी भर तारों में पढ़ना चाहिए, जिसमें से अंतिम कुछ [यादृच्छिक?] वर्णों का संग्रह है जो किसी भी तरह से बेस 64 एन्कोड किया जाना चाहिए और क्लाइंट को वापस भेजना चाहिए। मैंने सर्वर-साइड हैंडशेकिंग कोड खुद को लिखने की कोशिश की, लेकिन यह काम नहीं किया (हैंडशेकिंग प्रक्रिया कभी पूरा नहीं हुई, इसलिए मैं कभी भी अपने पैकेट भेजने और पुनर्प्राप्त करने में सक्षम नहीं था)। जावा पैकेज का उपयोग करते समय मैं एक ही सटीक परिणाम तक पहुंच गया था और किसी और ने एक ही काम करने के लिए लिखा था। – Josh1billion

उत्तर

32

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

केवल कच्चे टीसीपी समाधान होगा एक प्लगइन का उपयोग करना है जो किसी प्रकार की टीसीपी क्लाइंट ऑब्जेक्ट का समर्थन करता है। मैं आपको वेबसाकेट्स को आजमाने की सलाह दूंगा।

आप कई विकल्प here पा सकते हैं। पेज के भीतर बस वेबसाकेट की खोज करें।

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

+2

रॉब हॉक्स वीडियो का लिंक टूटा हुआ है, क्या यह वही बात है? http://youtu.be/_t28OPQlZK4 –

+2

@ जेसनस्पर्सके - हाँ, धन्यवाद। मैंने उदाहरण भी अपडेट किए हैं। – leggetter

7

मल्टीप्लेयर गेम के लिए सर्वर को क्लाइंट को विश्व स्थिति के आवधिक स्नैपशॉट भेजने की आवश्यकता होती है। ब्राउज़र एचटीएमएल/जेएस एप्लीकेशन के संदर्भ में आपके पास छोटे विकल्प हैं: मतदान क्षमताओं का विस्तार करने के लिए मतदान, वेबसाईट या अपनी खुद की प्लगइन लिखें।

HTTP मतदान जैसे BOSH या Bayeux परिष्कृत हैं लेकिन नेटवर्क ओवरहेड और विलंबता पेश करते हैं। वेबसाइकिल को उनकी सीमा को दूर करने के लिए डिज़ाइन किया गया था और निश्चित रूप से अधिक प्रतिक्रियाशील है।

cometd या socket io जैसे पुस्तकालय, परिवहन का एक अमूर्त प्रदान करते हैं और आपके लिए ब्राउज़र संगतता मुद्दों को हल करते हैं। इसके शीर्ष पर, यह अंतर्निहित परिवहन के बीच स्विच करने और प्रयास के बिना उनके प्रदर्शन की तुलना करने की अनुमति देता है।

मैंने multiplayer arcade game को सॉकेट.ओ और कोडसेट के साथ सामान्य माप 2 एमएम विलंबता और लैन पर एक्सएचआर-मतदान के साथ लगभग 30 एमएमएस के साथ कोड किया। यह एक मल्टीप्लेयर गेम के लिए पर्याप्त है।

मेरा सुझाव है कि आप nodejs और सॉकेट पर नज़र डालें।io क्लाइंट और सर्वर के बीच कोड साझा करने में सक्षम होने के लिए, आप कार को कुछ मल्टीप्लेयर कोड [3] पर उधार लेते हैं।

0

यदि आप अपने गेम के लिए जावास्क्रिप्ट का उपयोग करने की योजना बना रहे हैं (जैसा कि आप हैं) तो वेबसाकेट आपके लिए सबसे अच्छा विकल्प है। और यदि आप इंटरनेट एक्सप्लोरर के पुराने संस्करण का समर्थन करना चाहते हैं तो माइक्रोसॉफ्ट विकसित सिग्नल आर सिस्टम के बारे में सोचें। वे हुड के नीचे वेबसॉकेट का उपयोग कर रहे हैं, लेकिन उनके पास कुछ गिरावट वाले विकल्प भी हैं ... इसलिए प्रोटोकॉल उपलब्ध सर्वोत्तम उपलब्ध समाधान का उपयोग करेगा।

http://signalr.net/

+2

Socket.io हम एक आधिकारिक सर्वर की जरूरत है, ताकि धोखाधड़ी से खिलाड़ियों को रोकने के लिए, WebRTC काम करता है फ़ॉलबैक रूप में अच्छी तरह – JorgeGarza

6

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

  • node-webrtc सरल सर्वर साइड नेटवर्किंग
  • webrtc-native जो भी एक सर्वर साइड पुस्तकालय प्रदान करता है, और तेजी से अपने नाम के रूप में हो सकता है पता चलता है
  • electron-webrtc एक कार्यान्वयन है जो एक अच्छा मैच है आप वैकल्पिक रूप से electron

उपयोग कर, आप बख्शा जाना चाहते हैं, तो अपने खेल पैकेज करना चाहते हैं प्रदान करता है नेटवर्किंग कार्यान्वयन के वास्तविक विवरण, और आप एक पुस्तकालय की तलाश में हैं जो एक उच्च स्तरीय मल्टीप्लेयर इंटरफ़ेस प्रदान करता है, Lance.gg पर एक नज़र डालें। (अस्वीकरण: मैं योगदानकर्ताओं में से एक हूं)।

+0

है? हम WebRTC के साथ धोखाधड़ी कैसे रोकें? – trusktr

+0

और, ऐसा लगता है कि बाइनरी डेटा भेजने की तरह सबसे तेज़ होगा। लोग वेबसाकेट्स के साथ जेएसओएन को क्रमबद्ध कर रहे हैं (डी)। क्या वह धीमा नहीं है? हम वेब में आधिकारिक यूडीपी नेटवर्क कैसे बना सकते हैं? – trusktr

0

मूल रूप से, आप इस लेखन के समय में 3 विकल्प हैं:

WebSockets

WebSockets एक हल्के मैसेजिंग प्रोटोकॉल टीसीपी का इस्तेमाल करता है, बल्कि TCP सॉकेट की एक Javascript क्रियान्वयन से, आप जैसी है ' मैंने देखा हालांकि, शुरुआती हैंडशेक से परे, उस बिंदु से परे कोई HTTP शीर्षलेख पारित नहीं किया जा रहा है। एक बार कनेक्शन स्थापित होने के बाद, डेटा कम से कम ओवरहेड के साथ स्वतंत्र रूप से गुजरता है।

लंबी मतदान

लंबी मतदान, संक्षेप में, ग्राहक मतदान नई जानकारी के लिए सर्वर समय-समय पर HTTP अनुरोध के साथ शामिल है। यह सीपीयू और बैंडविड्थ के मामले में बेहद महंगा है, क्योंकि आप हर बार एक भारी नया HTTP शीर्षलेख भेज रहे हैं। पुराने ब्राउज़र के लिए यह अनिवार्य रूप से आपका एकमात्र विकल्प है, और Socket.io जैसे पुस्तकालय इन मामलों में फॉलबैक के रूप में लंबे मतदान का उपयोग करते हैं।

WebRTC

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

टीसीपी "गारंटी देता है" कि प्रत्येक पैकेट पहुंच जाएगा (विनाशकारी नेटवर्क विफलता के लिए सहेजें), और वे हमेशा भेजे गए क्रम में पहुंचेंगे। महत्वपूर्ण जानकारी के लिए यह बहुत अच्छा है जैसे स्कोर, हिट, चैट आदि।

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

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

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