क्या सी # एक वास्तविक समय गेम सर्वर के लिए व्यवहार्य है? [बन्द है]


22

अधिकांश प्रश्न शीर्षक में है।

असल में, मैं एक 2D मल्टीप्लेयर एक्शन गेम विकसित करना शुरू कर रहा हूं। क्लाइंट (शायद) XNA में होने जा रहा है, और मैंने सोचा कि मैं यहां इसके बारे में पूछूंगा कि क्या सर्वर साइड डेवलपमेंट के लिए भी C # का उपयोग करना अच्छा है।

मैं इस तथ्य का अनुमान लगाता हूं कि भाषा प्रबंधित है कुछ समस्याग्रस्त नहीं है क्योंकि जावा का उपयोग यहां तक ​​कि MMO गेम सर्वरों में भी किया जा रहा है (मुझे गलत होने पर सही करें), इसलिए इस उद्देश्य के लिए C # से बचने के लिए कोई कारण हैं? टीसीपी पर संवाद करने के लिए, SQL सर्वर के साथ चैट करने के लिए मुझे तेज और उत्तरदायी होना चाहिए। और अगर सी # से बचने का कोई कारण नहीं है, तो मैं ऐसे वेब सर्वर को कैसे तैनात करूंगा, क्या यह सर्वर मशीन पर चलने वाला .NET EXE होगा?


2
आप जावा MMO सर्वर के बारे में सही हैं ।
रिक

जवाबों:


22

मेरे अनुभव में न केवल व्यवहार्य, बल्कि वास्तव में अच्छा है। मैंने C # का उपयोग करके कई MMO सर्वर विकसित किए हैं, और मुझे यह कहना चाहिए कि मुझे भाषा और मंच की पसंद पर कभी पछतावा नहीं हुआ।

सामान्य रूप से C # और .NET के लिए बहुत सारे महान पुस्तकालय और उपकरण हैं - नेटवर्क, लॉगिंग, O / R मैपिंग, आदि। और, जावा C # की तुलना में अधिक अभिव्यंजक और कम क्रिया है (कुछ लोग इस बारे में बहस कर सकते हैं, हालांकि .. )

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

C # कितना कूल है, इसका एक उदाहरण है, यह वही है जिसे हमने हाल ही में लागू किया है। हमारा सर्वर कई WCF सेवाएँ चलाता है, जो गेम क्लाइंट गैर-समय-महत्वपूर्ण कार्यों के लिए उपयोग करता है, और हम उन्हें सर्वर प्रशासन के लिए भी उपयोग करते हैं। यह पता चला है, कॉल करने के लिए हमारे गेम ऑब्जेक्ट को बस वापस करने के लिए WCF सेवा बनाना बहुत आसान है। तो हमने बस यही किया, फिर LINQPad के लिए एक छोटा सा प्लगइन बनाया जो हमारे सर्वर से जुड़ता है - और अब हम जैसे प्रश्नों को चला सकते हैं

from character in Service.GetOnlineCharacters()
where character.LocationManager.LocationId==5 && character.Attributes.Level<10
select new { character.Id, character.Nick }

एक लाइव सर्वर पर, कोई कम नहीं! मुझे नहीं लगता कि आप किसी अन्य प्लेटफॉर्म के साथ ऐसा कर सकते हैं। कम से कम दो दिन के काम में नहीं।


मैं विशेष रूप से LINQ के उपयोग को पसंद करता हूं, यह सर्वर को इतना सरल और विकसित करने के लिए तेज बनाता है।
थॉमस

26

ज़रूर, आप C # का उपयोग कर सकते हैं।

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

एसक्यूएल के साथ बातचीत करने के लिए कई मजबूत एपीआई हैं, टीसी # के माध्यम से संचार, सी # में एट, या तो बेस फ्रेमवर्क के हिस्से के रूप में या तीसरे-पक्ष के माध्यम से, इसलिए आपको वहां कोई परेशानी नहीं होनी चाहिए।

आप ASP.NET या इसी तरह का उपयोग कर सकते हैं यदि आप वास्तव में चाहते हैं कि आपका सर्वर वेब-आधारित हो; यदि आप सिर्फ एक प्रक्रिया चलाना चाहते हैं और टीसीपी कनेक्शन के लिए सुनना चाहते हैं तो आप केवल .exe और सर्वर मशीन के लिए उपयुक्त निर्भरताएँ तैनात कर सकते हैं, उपयुक्त पोर्ट खोल सकते हैं और .exe चला सकते हैं।


5

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


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

3

यदि आपके लिए विंडोज पर तैनात करना ठीक है, तो मैं दृढ़ता से इसकी सिफारिश करूंगा, खासकर जब से आपका ग्राहक C # है।

हालांकि खेल सर्वर विकास को कम मत समझो। यहां तक ​​कि एक साधारण चैट-केवल समवर्ती सर्वर बनाना कोई तुच्छ कार्य नहीं है, और आपके पास जल्द ही संगामिति, लॉकिंग, प्रदर्शन, आदि के बारे में बहुत सारे प्रश्न होंगे।

एक शुरुआती बिंदु के रूप में, मैं चाहूंगा कि आप इस पृष्ठ पर एक नज़र डालें जो मोटे तौर पर यह बताता है कि कई प्लेटफार्मों में समवर्ती सॉकेट प्रोग्रामिंग कैसे करें:

http://geekswithblogs.net/quension/archive/2006/06/30/83760.aspx

यदि आप इसके बारे में वास्तव में गंभीर हैं, तो मैं आपको सलाह देंगे कि आप स्टीवंस के यूनिक्स नेटवर्क प्रोग्रामिंग का गहन अध्ययन करें। यह यूनिक्स पर सी सॉकेट्स पर केंद्रित है, लेकिन सिद्धांत हर दूसरे प्लेटफॉर्म के लिए समान हैं, जिनमें .net भी शामिल है।

संपादित करें: यह एक और महान संसाधन है, जो .net में समवर्ती सर्वर के लिए मापनीयता और प्रदर्शन पर केंद्रित है। यह अब उपलब्ध नहीं है, लेकिन जिस तरह से मशीन पर हमारे दोस्तों की एक प्रति है।

http://replay.waybackmachine.org/20080405220143/http://www.coversant.net/dotnetnuke/Coversant/Blogs/tabid/88/EntryID/10/Default.aspx


1

एक 'नुकसान' यह होगा कि C # के साथ यदि आप इसे कई प्लेटफार्मों पर उपयोग करना चाहते हैं तो आपको यह सुनिश्चित करने के लिए बहुत सावधानी बरतनी होगी कि आपका कोड मोनो के साथ काम करेगा। यदि आप परवाह करते हैं कि यह एक ही मंच पर चल रहा है और खिड़कियां वह मंच है, तो आपको कोई समस्या नहीं होनी चाहिए जैसा कि दूसरों ने उल्लेख किया है।


मत भूलिए कि मोनो का उपयोग अन्य प्लेटफार्मों पर तैनात करने के लिए किया जा सकता है। मेरा मानना ​​है कि दूसरा जीवन इस दृष्टिकोण का उपयोग करता है - उनकी आंतरिक खेल स्क्रिप्ट वास्तव में .NET IL के लिए संकलित की जाती है, फिर भी वे लिनक्स AFAIK पर तैनात हैं।
शैडोचेसर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.