अन्य उत्तरों में जुड़े लेख के अलावा, मैं एरियन प्रोजेक्ट के अनुभव के बारे में थोड़ा बता सकता हूं ।
चीजों को कैसे संतुलित रखें?
हमने कार्यों और धारणाओं की अवधारणा के चारों ओर have मरौरा ”का निर्माण किया है : उपयोगकर्ता के इनपुट को ले जाने वाले क्लाइंट से सर्वर को भेजे जाते हैं जैसे (चलना छोड़ दिया, राक्षसों पर हमला # 47, 'हैलो')। और सर्वर से ग्राहकों को धारणाएं उनके आसपास की दुनिया की स्थिति के बारे में बताते हुए भेजी जाती हैं। उन धारणाओं को हर मोड़ पर भेजा जाता है। गेम के आधार पर हम 30ms से 300ms के टर्न टाइम का उपयोग करते हैं।
हमारे पास दो प्रकार की धारणाएं हैं : एक पूर्ण धारणा लॉगिन पर भेजी जाती है और जब खिलाड़ी एक नए क्षेत्र (क्षेत्र) में प्रवेश करता है। उसके बाद अंतर धारणाओं को संशोधित वस्तुओं की केवल संशोधित विशेषताओं (जैसे स्थिति) सहित भेजा जाता है, और निश्चित रूप से नई और हटाए गए ऑब्जेक्ट।
कैसे विलंबता समस्याओं के आसपास काम करने के लिए?
हम "सर्वर हमेशा सही है" में दृढ़ विश्वास रखते हैं। क्लाइंट कुछ भविष्यवाणियाँ करता है जैसे कि चिकनी चलना, टकराव की जाँच इत्यादि। लेकिन अगर कोई क्लाइंट और सर्वर किसी बात को लेकर असहमत हैं, तो सर्वर जीत जाता है। सबप्रोजेक्ट स्टेंडल (एक 2 डी आरपीजी) डिफ़ॉल्ट रूप से 300ms के एक मोड़ समय का उपयोग करता है (बहुत अधिक चौरसाई किए गए ग्राहक पक्ष के साथ)। यह स्टेंडल को लैग के खिलाफ बहुत प्रतिरोधी बनाता है।
नोट: कुछ अन्य गेम नेटवर्क लैग के प्रभाव को कम करने के लिए क्लाइंट पर विश्वास करते हैं। वाह में यह अक्सर "वारसॉन्ग गुलच" नामक युद्ध क्षेत्र में से एक में शोषण किया गया था। दो तरीके हैं जो ध्वज के साथ एक खिलाड़ी चुन सकता है: बीच में एक सुरंग के माध्यम से और एक सही दृष्टि में पहाड़ी के ऊपर जा रहा है। तो एक धोखेबाज खिलाड़ी सुरंग की ओर भागता है, और फिर अपने लिए आगोश में ले जाता है। सर्वर और अन्य ग्राहक उसे अपनी ओर भागते हुए देखते रहेंगे। लेकिन थोड़े समय के बाद यह क्लाइंट सर्वर को बता सकता है कि वह पहाड़ी की ओर चला गया। WoW जाँच करेगा कि अंतिम प्रेषित निर्देशांक और वर्तमान के बीच की दूरी समय खंड के भीतर फिट होती है और इसे स्वीकार करते हैं।
यूडीपी बनाम टीसीपी का उपयोग
शुरुआती संस्करणों में हमने टीसीपी के ओवरहेड को कम करने के लिए यूडीपी का उपयोग किया। हमने अपने दम पर खोए हुए पैकेटों को संभाला। इसने परियोजना के शुरुआती दिनों में पूरी तरह से काम किया। लेकिन जब कई साल पहले सर्वर को कुछ होम डीएसएल कनेक्शन से वास्तविक डेटा सेंटर में स्थानांतरित कर दिया गया था, तो हमें बहुत बड़ा मुद्दा मिला। यूडीपी (या कम से कम 5 साल पहले था) फ़ायरवॉल हार्डवेयर की सीपीयू शक्ति पर अत्यधिक मांग: हर एक यूडीपी पैकेट पर नियम लागू होना चाहिए। टीसीपी के लिए, हालांकि, नियम केवल पहले 3 पैकेट के लिए लागू किया गया है। उसके बाद कनेक्शन स्थापित किया गया है। सभी निम्नलिखित पैकेट सामान्य नियम को बायपास करेंगे क्योंकि वे कनेक्टिंग ट्रैकिंग टेबल में हैं या क्योंकि उनके पास SYN ध्वज नहीं है।
रिवर्स इंजीनियरिंग से संचार और ग्राहक की रक्षा कैसे करें?
एरियन पूरी तरह से खुला स्रोत है, इसमें क्लाइंट, सर्वर, ग्राफिक्स, संगीत शामिल हैं। और निश्चित रूप से जिसमें हमारे प्रोटोकॉल प्रलेखन और यहां तक कि डिबगिंग के लिए उपयोग किया जाने वाला एक विश्लेषक भी शामिल है ।
एसएसएल का उपयोग करके तीसरे पक्ष द्वारा अनधिकृत सूँघने के खिलाफ संचार की रक्षा करना आसान है।
हालांकि, रिवर्स इंजीनियरिंग के खिलाफ इसे संरक्षित करना असंभव है। सुनिश्चित करें कि आप इसे बाधित कर सकते हैं और विरोधी डिबगिंग तकनीकों का उपयोग कर सकते हैं। लेकिन अंत में आप सॉफ्टवेयर की रिवर्स इंजीनियरिंग को नहीं रोक सकते जो आप उपयोगकर्ताओं को देते हैं। डेवलपर्स द्वारा डिबगिंग विरोधी तकनीकों में बहुत प्रयास करने के बावजूद स्काइप को कैसे उलट दिया गया, इस पर एक बहुत ही रोचक प्रस्तुति है: http://recon.cx/en/f/vskype-part1.pdf
नोट: कुछ देश ऐसे हैं जिनमें रिवर्स इंजीनियरिंग अवैध है या जो लाइसेंस में एक पैराग्राफ लगाने की अनुमति देता है या रिवर्स इंजीनियरिंग को रोकना है। लेकिन अन्य देश हैं (जैसे मैं जिस में रह रहा हूं) जो स्पष्ट रूप से संगत डेटा भंडारण प्रारूप या प्रसारण प्रोटोकॉल विकसित करने के संदर्भ में रिवर्स इंजीनियरिंग की अनुमति देता है, लाइसेंस में पैरा या शून्य को हटाने की कोशिश कर रहा है। (इस खंड में सब कुछ जहाँ तक मुझे पता है, मैं वकील नहीं हूँ)
सर्वर पर किन चीजों की गणना स्थानीय और किन चीजों से की जानी चाहिए?
हम सर्वर पर गेम लॉजिक से संबंधित हर चीज की गणना करते हैं। खेल को सुचारू रूप से चलाने के लिए क्लाइंट कुछ घटनाओं की भविष्यवाणी करेगा। लेकिन अंत में सर्वर हमेशा सही होता है।
पूर्ववर्ती घटनाएं उदाहरण के लिए होती हैं जब टकराव होता है तो आंदोलन को रोकना। स्टेंडल स्थिति तत्वों के लिए एक ग्रिड का उपयोग करता है। और सर्वर के दृष्टिकोण से, प्रत्येक इकाई के शीर्ष बाएं कोने बिल्कुल एक वर्ग पर है। लेकिन ग्राहक उन्हें टाइल्स के बीच आसानी से घुमाएगा। यह छद्म 3 डी प्रभाव भी आकर्षित करेगा। तो 1x1 के आधार वाली एक इकाई ग्राहक में अधिक हो सकती है।
लोड समस्याओं को कैसे संतुलित करें?
रखरखाव को आसान बनाने के लिए इसे यथासंभव सरल रखने की कोशिश करें।
स्थैतिक सामग्री का लोड संतुलन http सर्वर क्लस्टर और सामग्री वितरण नेटवर्क के क्षेत्र में अच्छी तरह से जाना जाता है।
खेल सेवाओं के लोड संतुलन के लिए एक सरल अवधारणा है, जो सर्वरों को क्षेत्रों / क्षेत्रों में विभाजित करती है। इसलिए ज़ोन एसी एक सर्वर पर और ज़ोन डीएफ दूसरे पर हैं। यह विशेष रूप से आसान है यदि आप एक सेट में ज़ोन से दूसरे सेट में ज़ोन नहीं देख सकते हैं। आपको कुछ चेक वहां लगाने की जरूरत है ताकि एक क्लाइंट केवल उस जोन सर्वर के लिए कनेक्ट हो सके जो कि उस खिलाड़ी के लिए जिम्मेदार है जो जोन में है।
एक सर्वर से दूसरे में खिलाड़ियों को स्थानांतरित करने का सबसे आसान तरीका है कि उन्हें डेटाबेस में लिखें, क्लाइंट को दूसरे ज़ोन सर्वर से कनेक्ट करने के लिए कहें, और उन्हें वर्तमान से डिस्कनेक्ट करें। क्लाइंट तब नए ज़ोन सर्वर से कनेक्ट होगा जो इसे डेटाबेस से लोड करेगा। (चूंकि आपको डेटाबेस स्टोर से / स्टोर से लोड की आवश्यकता है वैसे भी, हैंडओवर के लिए सर्वर के बीच सीधा संचार बाद में लागू किया जा सकता है)।
कुछ अतिरिक्त वैश्विक सेवाओं की आवश्यकता है: लॉगिन पर ग्राहकों को सही ज़ोन सर्वर से कनेक्ट करने के लिए कहा जाना चाहिए। और आप एक विश्व व्यापी चैट सिस्टम चाहते हैं।
मैं इस विषय पर विस्तार से जाना कि कैसे भार संतुलन को MMOs में हासिल किया गया है?