आप विकास के बाद के चरणों में नेटवर्किंग कोड को कैसे लिखने की अनुमति देते हैं?


12

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

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

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

संपादित करें 2: मुझे लगता है कि मैं कुछ संकेतकर्ताओं की तलाश कर रहा हूं कि मेरे दिमाग का सेट कैसा होना चाहिए। बस हर प्रभाव / परिवर्तन को तुरंत लागू करने के बजाय मुझे कीबोर्ड इनपुट, एनिमेशनिंग आदि को कैसे संभालना चाहिए। हम्म, मुझे सब के बाद कहीं भी जाने से पहले नेटवर्किंग पर ठीक से पढ़ने की आवश्यकता हो सकती है, जो मुझे स्थानीय स्तर पर काम करने वाले कुछ प्रकार के नेटवर्क कंकाल बनाकर दूर होने की उम्मीद थी।


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

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

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

यदि आप इसके बारे में सोचते हैं, तो minecraft के पास एकल खिलाड़ी गेम में भी एक स्थानीय सर्वर होता है। सर्वर इंजन है, क्लाइंट सिर्फ एक प्रस्तोता है।
स्पार्क

जवाबों:


12

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

हालाँकि, आप इस निर्णय पर विचार कर सकते हैं कि आप नेटवर्किंग कोड को आखिर तक छोड़ रहे हैं, यह इस बात पर निर्भर करता है कि आपके खेल के लिए कितना महत्वपूर्ण नेटवर्किंग है।

मेरा मतलब है कि, यदि आप एक नेटवर्क गेम जैसे कि एक MMORPG लिख रहे हैं, तो नेटवर्किंग को अंत तक छोड़ना बुद्धिमानी नहीं हो सकती है।

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

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

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

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

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

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


खैर, यह MMO नहीं है इसलिए यह नेटवर्किंग पर भारी नहीं होगा। हालाँकि यह एक बासी बोर्ड खेल नहीं है जहाँ एक चाल चलने से पहले सेकंड लेना ठीक है। मुझे लगता है कि नेटवर्किंग के बारे में जल्दी सोचना चाहिए, क्योंकि मेरे अनुभव में, अंतिम चरण में मल्टीप्लेयर को जोड़ने से काम नहीं चल रहा है। हालाँकि मैं नेटवर्क कोड लिखना और डिबगिंग नहीं करना चाहता हूं कि इससे पहले कि मैं अपने चरित्र को चारों ओर ले जा सकूं और वस्तुओं से टकरा जाऊं।
घोरक

2
@ शोर: आह, आप अपने उत्पाद को जल्द से जल्द सुंदर चीजें देखना चाहते हैं! खैर, हाँ, हम सब करते हैं। लेकिन उस प्रलोभन के आगे झुककर एक अच्छी तरह से डिजाइन और सुविचारित कार्यक्रम का नेतृत्व नहीं किया जा सकता है।
लाइटवेट रेस ऑर्बिट में

मैं इस उत्तर को स्वीकार करूँगा, हालाँकि मुझे अन्य उत्तर भी पसंद हैं। विशेष रूप से @Luaan द्वारा टिप्पणी
Ghork

2

मैं एक समान स्थिति में हूं, लेकिन मैं एक गेम से अधिक नेटवर्क सिमुलेशन करने की कोशिश कर रहा हूं; लेकिन मुझे लगता है कि मेरा दृष्टिकोण आपकी डिजाइन प्रक्रिया में मदद कर सकता है।

मेरा दृष्टिकोण आईपीसी (अंतर-प्रक्रिया संचार) पर आपकी टिप्पणी की रेखा के साथ है।

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

दूसरा, नेटवर्क घटकों को एक अलग पृष्ठभूमि के धागे में अलग करें ताकि आपके प्रारंभिक खेल के विकास में घटक को स्थानीय रूप से कोडित किया जा सके, लेकिन आपको थ्रेड पृथक्करण से निपटने के लिए मजबूर किया जाता है। उन्हें किसी भी अन्य विशेषताओं के साथ संयोजित न करें जो बाद में "स्थानीय पृष्ठभूमि" होगी, लेकिन उन्हें "संभावित दूरस्थ" पृष्ठभूमि थ्रेड्स में मजबूर करें।

इससे आपके तर्क को अलग रखने में मदद मिलेगी और साथ ही आपको प्रक्रिया में नेटवर्क विलंब कारकों को अनुकरण करने की अनुमति मिल सकती है ताकि आप विलंबता के प्रभाव को भी देख सकें।


मुझे लगता है कि उस पुस्तक को तब देखना पड़ेगा! ऐसा लगता है कि आपने जो कहा, वह करने में सक्षम है।
घोरक

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

1

यदि आप इस सभी सामग्री के बारे में सीख रहे हैं, तो एक एकल एकल-खिलाड़ी संस्करण 1 क्यों न लिखें, और एक बार जो आपके गहन ज्ञान के साथ काम कर रहा है, संस्करण 2 के लिए पूरी बात को गहराई से पुनर्विचार करें जो कि बहु-खिलाड़ी होगा?


0

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

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