नेटवर्क गेम कैसे लिखें? [बन्द है]


73

के आधार पर ऐसा क्यों है एक MMO विकसित करने के लिए बहुत मुश्किल है? :

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

मैं कुर्सियां, सर्वर, क्लाइंट, प्रोटोकॉल, कनेक्शन और ऐसी चीजों के बारे में सिद्धांत जानता हूं।

अब मुझे आश्चर्य है कि कोई नेटवर्क गेम लिखना कैसे सीख सकता है:

  • लोड समस्याओं को कैसे संतुलित करें?
  • खेल राज्य का प्रबंधन कैसे करें?
  • चीजों को कैसे संतुलित रखें?
  • रिवर्स इंजीनियरिंग से संचार और ग्राहक की रक्षा कैसे करें?
  • कैसे विलंबता समस्याओं के आसपास काम करने के लिए?
  • सर्वर पर किन चीजों की गणना स्थानीय और किन चीजों से की जानी चाहिए?
  • ...

क्या इसके बारे में कोई अच्छी किताबें, ट्यूटोरियल, साइटें, दिलचस्प लेख या अन्य प्रश्न हैं?

मैं व्यापक उत्तरों की तलाश में हूं, लेकिन अंतर जानने के लिए विशिष्ट व्यक्ति भी ठीक हैं।


4
हां, इस बारे में किताबें, ट्यूटोरियल, साइट, दिलचस्प लेख और अन्य प्रश्न हैं।
Ricket

2
मैंने इसे संशोधित किए बिना प्रश्न को आगे बढ़ाने के लिए इनाम जोड़ा और उपयोगकर्ताओं को जवाब देने के लिए एक कारण दिया क्योंकि यह प्रश्न उत्तर के योग्य है, इस प्रकार सर्वश्रेष्ठ उत्तर देने वाले को अपने काम के लिए प्रतिष्ठा मिलती है लेकिन एक भी ऐसा उत्तर नहीं है जो प्रश्न का उत्तर देता हो।
तमारा विजसमैन

जवाबों:


61

अन्य उत्तरों में जुड़े लेख के अलावा, मैं एरियन प्रोजेक्ट के अनुभव के बारे में थोड़ा बता सकता हूं ।

चीजों को कैसे संतुलित रखें?

हमने कार्यों और धारणाओं की अवधारणा के चारों ओर have मरौरा ”का निर्माण किया है : उपयोगकर्ता के इनपुट को ले जाने वाले क्लाइंट से सर्वर को भेजे जाते हैं जैसे (चलना छोड़ दिया, राक्षसों पर हमला # 47, 'हैलो')। और सर्वर से ग्राहकों को धारणाएं उनके आसपास की दुनिया की स्थिति के बारे में बताते हुए भेजी जाती हैं। उन धारणाओं को हर मोड़ पर भेजा जाता है। गेम के आधार पर हम 30ms से 300ms के टर्न टाइम का उपयोग करते हैं।

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

कैसे विलंबता समस्याओं के आसपास काम करने के लिए?

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

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

यूडीपी बनाम टीसीपी का उपयोग

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

रिवर्स इंजीनियरिंग से संचार और ग्राहक की रक्षा कैसे करें?

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

एसएसएल का उपयोग करके तीसरे पक्ष द्वारा अनधिकृत सूँघने के खिलाफ संचार की रक्षा करना आसान है।

हालांकि, रिवर्स इंजीनियरिंग के खिलाफ इसे संरक्षित करना असंभव है। सुनिश्चित करें कि आप इसे बाधित कर सकते हैं और विरोधी डिबगिंग तकनीकों का उपयोग कर सकते हैं। लेकिन अंत में आप सॉफ्टवेयर की रिवर्स इंजीनियरिंग को नहीं रोक सकते जो आप उपयोगकर्ताओं को देते हैं। डेवलपर्स द्वारा डिबगिंग विरोधी तकनीकों में बहुत प्रयास करने के बावजूद स्काइप को कैसे उलट दिया गया, इस पर एक बहुत ही रोचक प्रस्तुति है: http://recon.cx/en/f/vskype-part1.pdf

नोट: कुछ देश ऐसे हैं जिनमें रिवर्स इंजीनियरिंग अवैध है या जो लाइसेंस में एक पैराग्राफ लगाने की अनुमति देता है या रिवर्स इंजीनियरिंग को रोकना है। लेकिन अन्य देश हैं (जैसे मैं जिस में रह रहा हूं) जो स्पष्ट रूप से संगत डेटा भंडारण प्रारूप या प्रसारण प्रोटोकॉल विकसित करने के संदर्भ में रिवर्स इंजीनियरिंग की अनुमति देता है, लाइसेंस में पैरा या शून्य को हटाने की कोशिश कर रहा है। (इस खंड में सब कुछ जहाँ तक मुझे पता है, मैं वकील नहीं हूँ)

सर्वर पर किन चीजों की गणना स्थानीय और किन चीजों से की जानी चाहिए?

हम सर्वर पर गेम लॉजिक से संबंधित हर चीज की गणना करते हैं। खेल को सुचारू रूप से चलाने के लिए क्लाइंट कुछ घटनाओं की भविष्यवाणी करेगा। लेकिन अंत में सर्वर हमेशा सही होता है।

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

लोड समस्याओं को कैसे संतुलित करें?

रखरखाव को आसान बनाने के लिए इसे यथासंभव सरल रखने की कोशिश करें।

स्थैतिक सामग्री का लोड संतुलन http सर्वर क्लस्टर और सामग्री वितरण नेटवर्क के क्षेत्र में अच्छी तरह से जाना जाता है।

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

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

कुछ अतिरिक्त वैश्विक सेवाओं की आवश्यकता है: लॉगिन पर ग्राहकों को सही ज़ोन सर्वर से कनेक्ट करने के लिए कहा जाना चाहिए। और आप एक विश्व व्यापी चैट सिस्टम चाहते हैं।

मैं इस विषय पर विस्तार से जाना कि कैसे भार संतुलन को MMOs में हासिल किया गया है?


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

2
@ डैनी, एक नया टीसीपी-कनेक्शन शुरू करने के लिए तीन पैकेट आवश्यक हैं: क्लाइंट टू सर्वर: एसवाईएन, सर्वर टू क्लाइंट: एसवाईएन एसीके, क्लाइंट टू सर्वर: एसीके + डेटा। यह यूडीपी से एक दौर की यात्रा है, लेकिन यह केवल शुरुआत में ही होता है जब ग्राहक पहली बार सर्वर से संपर्क करता है। एक स्थापित कनेक्शन में हर पैकेट को बिना किसी अतिरिक्त दौर की यात्राओं के तुरंत संसाधित किया जाता है। एक ACK- उत्तर होगा, लेकिन प्राप्त डेटा पहले से ही संसाधित है जबकि ACK पैकेट वापस यात्रा करता है।
हेंड्रिक ब्रम्मनमैन

1
@ डैनी, टीसीपी पैकेट लॉस को स्वचालित रूप से और काफी कुशल तरीके से हैंडल करता है। यूडीपी का उपयोग करके स्वयं को फिर से लागू करना कठिन है; जब तक कि आपका प्रोटोकॉल रैंडम अनडिलीवर पैकेट के साथ ठीक न हो। अगली समस्या यह है कि टीसीपी सुनिश्चित करता है कि पैकेट का ऑर्डर, जबकि यूडीपी पैकेट गलत क्रम में प्राप्त हो सकता है। फिर से, अपने आप को फिर से लागू करना मुश्किल है, जब तक कि आप केवल पैकेट काउंटर के आधार पर पुराने पैकेट को अनदेखा नहीं कर सकते। यदि टीसीपी के लिए बहुत कम प्रतिक्रिया समय की आवश्यकता है, तो नागले के एल्गोरिथ्म को अक्षम करने की आवश्यकता है।
हेंड्रिक ब्रम्मनमैन

ऐसा लगता है कि आपने बहुत वास्तविक टीसीपी अंतराल मुद्दे को संबोधित किए बिना अपनी स्थिति का सख्ती से बचाव किया है। शायद सच्ची समस्या DDoS प्रतिरोधी प्रोटोकॉल के बजाय हार्डवेयर फ़ायरवॉल की आपकी पसंद है
मिकला

27

http://gafferongames.com/networking-for-game-programmers/

गेम नेटवर्किंग से संबंधित विभिन्न समस्याओं और समाधानों पर लेखों का एक बड़ा समूह है।


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

7
आप भले ही कम से कम उन सभी को टीसीपी सुविधाओं को फिर से नहीं बना रहे हैं। टीसीपी प्रवाह नियंत्रण और पैकेट हानि शब्दार्थ एक खेल के लिए भयानक है जिसमें कम विलंबता कनेक्शन की आवश्यकता होती है। यदि आप विलंबता या आवश्यक बैंडविड्थ को कम करने के बारे में परवाह नहीं करते हैं तो टीसीपी केवल उपयोगी है।
jsimmons

2
UDP से HTTP पर TCP पर जाकर दूसरा जीवन बड़े पैमाने पर बेहतर हुआ: blogs.sondondlife.com/community/technology/blog/2010/08/13/…
Hendrik Brummermann

5
उह वास्तव में नहीं, उन्होंने अपनी परिसंपत्ति स्ट्रीमिंग के प्रदर्शन में सुधार किया कि यह कैसे काम करता है। उस उदाहरण में HTTP / TCP का उपयोग करना उनके लिए लागू करना आसान हो गया, न कि तेज। मैं यह भी नोट कर सकता हूं कि ज़ीरोमक एक दिलचस्प परियोजना है, और यह गेम नेटवर्किंग के लिए बहुत अच्छी तरह से पैमाने पर हो सकता है। zeromq.org
jsimmons

8

आपके द्वारा लिखे जा रहे गेम के प्रकार के आधार पर, आप कुछ निम्न-स्तरीय नेटवर्क प्रोग्रामिंग से बचने में सक्षम हो सकते हैं। कुछ प्रकार के गेम को क्लाइंट और सर्वर के बीच बहुत आगे और पीछे संचार की आवश्यकता नहीं होती है। ऐसे मामलों में, कोई उच्च स्तर के ढांचे का उपयोग करने का विकल्प चुन सकता है। उदाहरण के लिए, मैं C # /। NET में टर्न-आधारित रणनीति गेम विकसित कर रहा हूं। टर्न-बेस्ड स्ट्रैटेजी गेम कुछ इस तरह से अनूठे हैं कि अधिकांश क्लाइंट / सर्वर संचार एक मोड़ की शुरुआत और अंत में होता है, बीच में अपेक्षाकृत कम होता है। इस प्रकार, मैंने मुख्य रूप से वेब सेवाओं के लिए डिज़ाइन किया गया एक उच्च-स्तरीय संचार ढांचा विंडोज कम्युनिकेशन फाउंडेशन (डब्ल्यूसीएफ) का उपयोग करने का विकल्प चुना। सीधे सॉकेट्स के साथ काम करने के बजाय और सभी निम्न-स्तरीय नेटवर्किंग गंक, मैं वह बना सकता हूं जो मानक विधि कॉल के रूप में प्रकट होता है, और WCF को मेरे लिए प्रोटोकॉल और परिवहन परतों से निपटने दें। केवल एक बार मुझे निम्न-स्तरीय नेटवर्क सामग्री से निपटना पड़ा, जब मैंने अपने समापन बिंदुओं को कॉन्फ़िगर किया था, जो कि एक विन्यास फाइल में एक बार का सौदा है। यह अभी भी कुछ कस्टम क्रमांकन तर्क को लागू करने के लिए आवश्यक हो सकता है, लेकिन आपको इस तरह की बात करने की आवश्यकता होगी।


8

सवाल बहुत व्यापक है। उत्तर अपने दम पर एक वेबसाइट भर सकता है। लेकिन, ऐसी किताबें हैं जो इस पर स्पर्श करती हैं, मुख्य रूप से ये दो:

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

(ध्यान दें कि मैं मूल प्रश्न में MMOs के बारे में अधिक बात कर रहा हूं - एक 'नेटवर्क गेम' का मतलब पीएचपी-आधारित टेक्स्ट गेम से सभी प्रकार की चीजें एक MMO के माध्यम से हो सकता है, और उप-प्रश्न सभी के ऊपर नहीं हैं। प्रत्येक प्रकार पर लागू होता है।)


7

लोड समस्याओं को कैसे संतुलित करें?

निश्चित भौगोलिक आकार + कई उदाहरण सबसे आसान समाधान है। SWG पर काम करने वाले लोगों ने गतिशील आकार की कोशिश की और इसे पछतावा किया।

खेल राज्य का प्रबंधन कैसे करें?

सर्वर आधिकारिक है।

चीजों को कैसे संतुलित रखें?

सर्वर से आवधिक सिंक अपडेट। (यह निश्चित नहीं है कि चिंता यहाँ क्या है)

रिवर्स इंजीनियरिंग से संचार और ग्राहक की रक्षा कैसे करें?

असंभव। बस सुनिश्चित करें कि आप क्लाइंट से प्राप्त किसी भी चीज़ पर भरोसा नहीं करते हैं, और यह कि सर्वर आधिकारिक है।

कैसे विलंबता समस्याओं के आसपास काम करने के लिए?

यह मील गहराई तक जाता है, लेकिन सतही तौर पर आप क्लाइंट के सर्वर पर एक ही सिमुलेशन चलाते हैं और जब सिंक होता है, तो चीजों को ठीक करें। क्लाइंट पर किए गए सभी निर्णय सर्वर पर भी सिम्युलेटेड होते हैं, इसलिए खराब निर्णय हो सकते हैं, लेकिन चीजें आम तौर पर काम करती हैं।

सर्वर पर किन चीजों की गणना स्थानीय और किन चीजों से की जानी चाहिए?

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

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


4

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.