2008-09-18 12 views
16

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

मैंने वास्तव में फैसला नहीं किया है कि क्या करना है, लेकिन इस प्रश्न के प्रयोजन के लिए आप एक्स वाई आंदोलन के साथ 10-खिलाड़ी 2 डी गेम पर विचार कर सकते हैं।

उत्तर

19
  • 'क्लाइंट सर्वर' या 'पीयर टू पीयर' या बीच में कुछ: किस कंप्यूटर के पास कौन सी गेम क्रियाएं हैं।

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

बेशक आप एक मॉडल से शुरू कर सकते हैं जहां 'प्रत्येक ग्राहक के पास' ऑब्जेक्ट्स 'पर अधिकार होता है और धोखाधड़ी की समस्या को अनदेखा करता है (कुछ मामलों में ठीक है)। लेकिन अब आप गेम सिमुलेशन पर बड़े पैमाने पर असर के लिए कमजोर हैं यदि वह ग्राहक बाहर निकलता है, या यहां तक ​​कि 'सिमुलेशन को बनाए रखने में थोड़ा पीछे आता है' - प्रभावी रूप से प्रत्येक खिलाड़ी गेम एक के प्रभाव को महसूस/महसूस कर देगा लापरवाही या अन्यथा कम प्रदर्शन करने वाले क्लाइंट के रूप में, या तो ग्राहक को पकड़ने के लिए प्रतीक्षा करने के लिए, या गैमेस्टेट को सिंक से नियंत्रित करने के रूप में।

  • 'सिंक्रनाइज़' या 'asynchronus'

एक आम रणनीति सभी खिलाड़ियों को सुनिश्चित करने के लिए एक ही gamestate पर काम कर रहे हैं बस प्लेयर आदानों (की सूची पर सहमत करने में ऊपर वर्णित मॉडलों में से एक के माध्यम से है) और फिर गेमप्ले सिमुलेशन सभी मशीनों पर सिंक्रनाइज़ रूप से खेलें। इसका मतलब है कि अनुकरण तर्क को बिल्कुल मेल खाना है, या गेम सिंक से बाहर हो जाएंगे। यह वास्तव में यह लगता है की तुलना में आसान और कठिन दोनों है। यह आसान है क्योंकि एक गेम सिर्फ कोड है, और कोड एक ही इनपुट (यहां तक ​​कि यादृच्छिक संख्या जेनरेटर) देने पर बिल्कुल वही निष्पादित करता है। यह कठिन है क्योंकि दो मामले हैं जहां यह मामला नहीं है: (1) जब आप गलती से अपने गेम सिमुलेशन के बाहर यादृच्छिक रूप से उपयोग करते हैं और (2) जब आप फ्लोट का उपयोग करते हैं। पूर्व में किस गेम सिस्टम द्वारा आरएनजी का उपयोग किया जाता है, इस पर सख्त नियम/दावा करके पूर्व को सुधार दिया जाता है। उत्तरार्द्ध फ्लोट्स का उपयोग न करके हल किया जाता है। (फ्लोट्स में वास्तव में 2 समस्याएं होती हैं, एक वे आपके प्रोजेक्ट की ऑप्टिमाइज़ेशन कॉन्फ़िगरेशन के आधार पर बहुत अलग तरीके से काम करते हैं, लेकिन अगर यह काम किया जाता है, तो वे विभिन्न प्रोसेसर आर्किटेक्चर एटीएम, एलओएल में असंगत रूप से काम करते हैं)। स्टारक्राफ्ट/वॉरक्राफ्ट और कोई भी गेम जो 'रीप्ले' प्रदान करता है, इस मॉडल का सबसे अधिक उपयोग करता है। वास्तव में, एक रीप्ले सिस्टम होने का परीक्षण करने का एक शानदार तरीका है कि आपके आरएनजी सिंक में रह रहे हैं।

एसिंक्रोनस समाधान के साथ गेम स्टेट अथॉरिटी बस कुछ सारी आवृत्ति पर सभी अन्य ग्राहकों को पूरे राज्य को प्रसारित करते हैं। ग्राहक उस डेटा को लेते हैं और स्लैम को अपने गैमेस्टेट में लेते हैं (और मानक तब तक कुछ सरल एक्सट्रापोलेशन करते हैं जब तक उन्हें अगला अपडेट नहीं मिलता)। यहां वह जगह है जहां 'udp' एक व्यवहार्य विकल्प बन जाता है, क्योंकि आप हर ~ 1sec या तो पूरे गैमेस्टेट को स्पैमिंग कर रहे हैं, तो उन अद्यतनों का कुछ अंश छोड़ना अप्रासंगिक है। उन खेलों के लिए जिनके पास अपेक्षाकृत कम गेम स्टेटस (भूकंप, वॉरक्राफ्ट की दुनिया) है, यह अक्सर सबसे आसान समाधान होता है।

6

अप मल्टीप्लेयर

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

  2. फ़ायरवॉल/कनेक्शन होना चाहिए। यह सुनिश्चित करना कि आपके मल्टीप्लेयर गेम को 2000 आउटबाउंड कनेक्शन नहीं बनाना है और मानक पोर्ट का उपयोग करना है, इसलिए पोर्टफॉरवर्डिंग आसान है। विंडोज फ़ायरवॉल के साथ इसे इंटरफ़ेस करना शायद एक अतिरिक्त बोनस होगा।

  3. बैंडविड्थ। यह महत्वपूर्ण है, आप नेटवर्क कनेक्शन के माध्यम से कितना डेटा धक्का देना चाहते हैं? मुझे लगता है कि यह परीक्षण और रिकॉर्डिंग थ्रूपुट खेलने के लिए नीचे आ जाएगा। यदि आपको प्रत्येक ग्राहक के लिए 200kb/s की आवश्यकता होती है तो आप कुछ चीजों पर पुनर्विचार करना चाह सकते हैं।

  4. सर्वर लोड। यह भी महत्वपूर्ण है कि एक सामान्य गेम के लिए सर्वर द्वारा कितनी प्रोसेसिंग की आवश्यकता होती है? क्या आपको इसे चलाने के लिए 16 जीबी रैम के साथ कुछ सुपर 8 कोर सर्वर की आवश्यकता है? क्या इसे कम करने के तरीके हैं?

मुझे लगता है कि ढेर अधिक हैं, लेकिन वास्तव में आप एक ऐसा गेम चाहते हैं जो नेटवर्क पर और विभिन्न कनेक्शनों पर खेलने के लिए आरामदायक हो।

4

धोखाधड़ी से परहेज करना कितना महत्वपूर्ण है?

वस्तु मॉडल कैसे वस्तुओं एक से दूसरे मशीन से सूचित कर रहे हैं [आप किसी भी जानकारी के लिए भरोसा कर सकते हैं एक ग्राहक से आ रही है या वे पर भरोसा किया और प्रमाणीकृत किया जा सकता है?]? किसी वस्तु पर कार्यवाही कैसे की जाती है?

क्या आप ग्राहक/सर्वर या सहकर्मी के साथ सहकर्मी कर रहे हैं?

यादृच्छिक संख्या आप तो सहकर्मी आप उन्हें लॉक-कदम रखा और यादृच्छिक संख्या सिंक्रनाइज़ रखने की जरूरत है एक सहकर्मी करते हैं।

यदि आप क्लाइंट/सर्वर कर रहे हैं तो आप अंतराल से कैसे निपटते हैं? [मृत गणना?]

नेटवर्क कोडिंग में बहुत सी गैर-छोटी समस्याएं शामिल हैं।

राकनेट दोनों को डाउनलोड करें और यह कोड डाउनलोड करने के लिए स्वतंत्र है और यह चर्चा समूह है।

6

योजना आपका सबसे अच्छा दोस्त है। यह पता लगाएं कि आपकी ज़रूरतें वास्तव में क्या हैं।

लोड हो रहा डेटा: क्या प्रत्येक कंप्यूटर में एक ही मॉडल और ग्राफिक्स होने जा रहे हैं, और केवल नाम और स्थान नेट पर स्थानांतरित हो जाते हैं। यदि प्रत्येक खिलाड़ी अपने चरित्र या अन्य वस्तुओं को कस्टमाइज़ कर सकता है, तो आपको इस डेटा को चारों ओर ले जाना होगा।

धोखाधड़ी: क्या आपको इसके बारे में चिंता करने की ज़रूरत है? क्या आप भरोसा कर सकते हैं कि प्रत्येक ग्राहक क्या कह रहा है। यदि नहीं तो आप सर्वर साइड लॉजिक क्लाइंट साइड लॉजिक से अलग दिखेंगे। इस साधारण मामले की कल्पना करें, आपके 10 खिलाड़ियों में से प्रत्येक के पास पावर अप की वजह से एक अलग गति गति हो सकती है। धोखाधड़ी को कम करने के लिए आपको गणना करना चाहिए कि प्रत्येक खिलाड़ी सर्वर से संचार अपडेट के बीच कितना दूर जा सकता है, अन्यथा कोई खिलाड़ी वहां गति से हैक कर सकता है और कुछ भी उन्हें रोक नहीं सकता है। यदि कोई खिलाड़ी लगातार अपेक्षाकृत थोड़ा तेज़ होता है या एक बार कूदता है, तो सर्वर उन्हें संभवतः निकटतम स्थान पर स्थानांतरित कर देगा, क्योंकि संभवतः यह घड़ी की घड़ी या संचार में एक बार बाधा है। हालांकि यदि कोई खिलाड़ी लगातार जितना संभव हो सके दो बार आगे बढ़ रहा है तो उन्हें खेल से बाहर निकालने के लिए समझदार हो सकता है। जितना अधिक गणित, खेल राज्य के अधिक हिस्सों में आप सर्वर पर दोबारा जांच कर सकते हैं, गेम जितना अधिक संगत होगा, आकस्मिक रूप से यह धोखाधड़ी को कठिन बना देगा।

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

फिर से योजना बनाना आपकी सबसे अच्छी मित्र योजना, योजना, योजना है। यदि आप पर्याप्त समस्या के बारे में सोचते हैं तो आप अधिकांश समस्याओं के माध्यम से अपना रास्ता सोच सकते हैं। फिर आप उन लोगों के बारे में सोचना शुरू कर सकते हैं जिन्हें आपने अभी तक हल नहीं किया है।

0

यदि आपका लैन पर चल रहा है तो टीसीपी ठीक है। लेकिन यदि आप ऑनलाइन खेलना चाहते हैं, तो आपको यूडीपी का उपयोग करना होगा और अपनी टीसीपी जैसी परत लागू करना होगा: एनएटी रूटर फेंकना जरूरी है।

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

खेल उद्देश्य के लिए प्लेयर कार्रवाई का इतिहास न रखें (ऐसा करें, लेकिन केवल रीप्ले कार्यक्षमता के लिए)। यदि आप उस बिंदु तक पहुंचते हैं जहां यह आवश्यक है, तो प्रत्येक खिलाड़ी को प्रतीक्षा करें।

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