2013-04-28 5 views
6

मैं वर्तमान में एक बहुत पुरानी mmorpg के सर्वर पक्ष को फिर से लिख रहा हूं, और मैं सी/सी ++ के साथ उपयोग करने के लिए एक अच्छी ओपनसोर्स नेटवर्क लाइब्रेरी की तलाश में था।एमएमओआरजीपी के सर्वर पक्ष के लिए नेटवर्क लाइब्रेरी (libuv/boost :: asio?)

चूंकि ग्राहक पहले से मौजूद है, मैं किसी भी पुस्तकालय का उपयोग नहीं कर सकता जो किसी प्रकार की पैकेट संरचना या संचार (उदाहरण के लिए, राकनेट) को लागू करता है।

सर्वर मुख्य रूप से यूडीपी का उपयोग तीन अलग-अलग बंदरगाहों पर करेगा।

इंटरनेट पर खोज करने के बाद, मुझे boost :: asio और libuv के बारे में पता चला।

बूस्ट :: एएसओ एक परिपक्व विकल्प की तरह लगता है, क्योंकि मैं पहले से ही बढ़ावा का उपयोग कर रहा हूं, लेकिन मैंने पढ़ा है कि उनका यूडीपी कार्यान्वयन थोड़ा खराब है, और यह एक मल्टीकोर प्रोसेसर के अधिकतम प्रदर्शन को प्राप्त नहीं कर सकता है एपोल का उपयोग करते समय कुछ ताले।

libuv महान प्रतीत होता है, घटना-संचालित है, जो एक बड़ी परियोजना द्वारा समर्थित है, लेकिन वर्तमान में इसका उपयोग करने के लिए इस तरह की कोई परियोजना नहीं है, इसलिए मुझे इसके बारे में संदेह है।

आप क्या सोचते हैं? क्या मैं इस तरह की परियोजना में libuv का उपयोग कर सकता हूं, या मुझे boost :: asio के साथ जाना होगा? मैं अन्य सुझावों के लिए भी खुला हूं (उन्हें क्रॉस-प्लेटफ़ॉर्म होने की आवश्यकता है, और मैंने पहले से ही enet, libevent और libev को त्याग दिया है)।

+0

[liblacewing] (http: // lacewing-project।संगठन) इसके लिए भी एक अच्छा फिट हो सकता है (विंडोज़ पर एपॉल, क्यूक्यू या आईओसीपी का समर्थन करता है)। प्रकटीकरण: मैं मुख्य डेवलपर हूं। –

+0

कूल प्रोजेक्ट, मैं इसे देख लूंगा, लेकिन मुझे एएसओ का उपयोग करने का लुत्फ उठाना है, क्योंकि मैं पहले ही बूस्ट का उपयोग करूंगा। – RenatoUtsch

+2

@RenatoUtsch हाय रेनाटो, और एक साल बाद, आपने क्या चुना है? क्या आप हमें अपने अनुभव पर कुछ रिटर्न दे सकते हैं? धन्यवाद –

उत्तर

4

या तो libuv या Boost.Asio ठीक होना चाहिए। मैंने वास्तविक समय और निकट-वास्तविक समय दोनों अनुप्रयोगों में पुस्तकालयों के बीच समान परिणाम देखे हैं।

आप Boost.Asio का उपयोग करते हैं, के बारे में पता होना:

  • कैसे handler memory allocation की मात्रा को कम करने के लिए।
  • io_service लॉकिंग concurrency_hint 1 से io_serviceconstructor पर लॉकिंग को समाप्त किया जा सकता है। हालांकि, यह रिएक्टर के भीतर लॉकिंग को रोक नहीं पाएगा।

खेल विकास के साथ मेरा अनुभव से:

  • नेटवर्क क्षमताओं या तो एक इंटरफेस या कतार के माध्यम से खेल कोड के लिए प्रदान की जाती हैं, तो यह करने के लिए एक घटना के आधार पर पुस्तकालय के बीच स्वैप करने के लिए काफी तुच्छ है एक अन्य घटना-आधारित लाइब्रेरी, जैसे Boost.Asio और libuv।
  • सर्वर आर्किटेक्चर का नेटवर्क कोड से कहीं अधिक प्रभाव पड़ता है। Boost.Asio और libuv दोनों आईपीसी कार्यक्षमता प्रदान करते हैं जो बहु-डिमन सर्वर आर्किटेक्चर के लिए उपयोगी हो सकता है।

जबकि दोनों पुस्तकालयों के बीच कुछ ओवरलैप है, तो this तुलना पढ़ने के लिए उपयुक्त हो सकता है।

+0

लेकिन यदि मैं 1 का 'concurrency_hint' निर्दिष्ट करता हूं, तो io_service केवल एक ही थ्रेड पर चलाएगा। मैं मल्टीथ्रेडिंग का लाभ कैसे ले सकता हूं? और तुलना के लिए धन्यवाद, यह वास्तव में बहुत मदद की। – RenatoUtsch

+0

आप एकाधिक 'io_service' ऑब्जेक्ट्स का उपयोग कर सकते हैं। यह दृष्टिकोण libuv के समान है, क्योंकि libuv एकाधिक ईवेंट लूप का समर्थन करता है, लेकिन यह एकाधिक थ्रेड से उसी लूप को चलाने का समर्थन नहीं करता है। Boost.Asio के साथ, यदि आप _concurrency_hint_ सेट नहीं करते हैं, तो एकाधिक थ्रेड सुरक्षित रूप से ईवेंट लूप की सेवा कर सकते हैं। –

+0

लेकिन concurrency_hint को सेट करने से रिएक्टर के साथ लॉकिंग समस्याएं उत्पन्न हो जाएंगी। खैर, तो मैं प्रोसेसर के कोर की संख्या के आधार पर विभिन्न io_service ऑब्जेक्ट लॉन्च करूंगा। मैं पढ़ रहा था कि एएसओ का यूडीपी कार्यान्वयन बहुत अच्छा नहीं है, क्या यह सच है? अगर इससे कोई फर्क पड़ता है, तो मुझे libuv का उपयोग करना होगा। अपको इस बारे में कुछ पता है? – RenatoUtsch

1

libevent उत्कृष्ट है और मुझे आश्चर्य है कि आपने इसे छोड़ दिया है। ज़ीरोएमक्यू बहुत अच्छा है लेकिन विंडोज़ समर्थन थोड़ा सीमित है। एसएफ में मेरा एक फाइनेंड द्वारा खरगोश एमक्यू किया जा रहा है।

Boost.asio भी बहुत अच्छा है। चूंकि ऐसा लगता है कि आप सी ++ तक सीमित हैं, तो libevent वह है जो मैं उपयोग कर रहा हूं और इसे अन्य एमएमओ खिताबों से दूर करना चाहिए जिस पर मैंने नेटवर्क विलंबता और उत्तरदायी नेटवर्किंग के मामले में काम किया है, लेकिन इसे टीसीपी की आवश्यकता है।

+0

libevent (और libev) की समस्या यह है कि उनके विंडोज़ समर्थन बहुत अच्छा नहीं है। इसके अलावा, यह वास्तव में बहुत अच्छा लगता है। तब मुझे libuv मिला, जिसे node.js पर libev के लिए "प्रतिस्थापन" के रूप में बनाया गया था, जो तेजी से और विंडोज़ का समर्थन करने का दावा करता था। मैं वास्तव में इसका उपयोग करने के लिए प्रलोभन हूँ। क्या आपने कभी इसका अनुभव किया है? – RenatoUtsch

+0

और साथ ही, जब आप कहते हैं कि "इसे टीसीपी की आवश्यकता है" तो आपका क्या मतलब है? क्या मैं इसके साथ केवल यूडीपी का उपयोग नहीं कर सकता? – RenatoUtsch

+0

libevent बहुत अच्छा लगता है ... मैं इसे यहां लगभग 2 महीने के लिए उपयोग कर रहा हूं और यह बहुत ही संवेदनशील है। Libevent के लिए सबसे अच्छा समर्थन टीसीपी है। हालांकि, कुछ समर्थन है ... केवल सामानों की आवश्यकता नहीं है जो आपको पैकेट ऑर्डरिंग और जिंदा रखने की आवश्यकता होगी। आइओ, आपको इन्हें लागू करने की आवश्यकता होगी जैसे आप नियमित रूप से udp में करेंगे। इसके अलावा, आप इस लिंक को पढ़ने का आनंद ले सकते हैं। http://stackoverflow.com/questions/11361208/high-performance-scalable-udp-servers –

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