C / C ++ मल्टीप्लेयर गेम के लिए नेटवर्क संदेशों को क्रमबद्ध और अनसेज़लाइज़ करने के सर्वोत्तम तरीके क्या हैं?


11

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

क्या मुझे बस सॉकेट में संरचनाएं पढ़नी चाहिए? प्रोटिकॉल बफ़र्स / थ्रिफ्ट का उपयोग करें?

मुझे डेटा के सरणियों का प्रतिनिधित्व कैसे करना चाहिए?

डेटा पैक / अनपैक करने के लिए इंटरफ़ेस कैसा दिखना चाहिए?

जवाबों:


12

मान लिया जाये कि ...

  1. आप बाइट्स के एक बफर में परिवर्तित करने के बारे में बात कर रहे हैं
  2. आप यूडीपी का उपयोग कर रहे हैं और प्रदर्शन एक चिंता का विषय है

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

क्या मुझे बस सॉकेट में संरचनाएं पढ़नी चाहिए? प्रोटिकॉल बफ़र्स / थ्रिफ्ट का उपयोग करें?

  • हां, संपूर्ण संरचना पढ़ें यदि आपने संपूर्ण संरचना की आवश्यकता है
  • नहीं, पैकेट संरचना स्वयं बनाएं, यह निश्चित रूप से इन विधियों का उपयोग करके क्रमांकन से छोटा होगा; आपको पता होना चाहिए कि पैकेट में कौन सा डेटा शामिल होना चाहिए

मुझे डेटा के सरणियों का प्रतिनिधित्व कैसे करना चाहिए?

  • डेटा के सरणियों के रूप में। प्राप्त करते समय सरणी के तत्वों की गिनती भेजने से बचने के लिए डेटा के अंत तक बफर पढ़ना जारी रखें

डेटा पैक / अनपैक करने के लिए इंटरफ़ेस कैसा दिखना चाहिए?

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

एक आखिरी बात, पैकेट आकार है विशेष रूप से एक स्नैपशॉट के लिए, एक चिंता का विषय: आकार = packetSize एक्स संस्थाओं x connectedPlayers; तो आपके पास प्रति पैकेट 60 x 10 x 16 = 9,600 बाइट्स हो सकते हैं, फिर इस 20 बार एक दूसरे को भेजना: = 192,000 बीपीएस = 187 केबीपीएस। यह स्पष्ट रूप से एक उच्च बैंडवाइट अपलोड गति है। इस प्रकार जहां संभव हो वहां पैकेट आकार में योगदान करने वाले प्रत्येक कारक को कम से कम करने की आवश्यकता है।

इस लेख ने मुझे बहुत मदद की है: वाल्व मल्टीप्लेयर नेटवर्किंग


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

1
आपकी सरणी विधि सामान्य स्थिति में काम नहीं करने वाली है - 'डेटा का अंत' कहाँ है? यहां तक ​​कि अगर आपके संदेश सीमांकित हैं, तो इसका मतलब है कि आपके पास प्रति संरचना 1 से अधिक सरणी नहीं हो सकती है। इसे ठीक करने के लिए, मूल पोस्टर या तो निर्धारित लंबाई के सरणियों से चिपक सकता है, या यह सुनिश्चित कर सकता है कि प्रति संरचना केवल 1 सरणी (संरचना के अंत में) हो, या सरणी के प्रारंभ में एक गणना मूल्य भेजें।
काइलोटन

बस एक और टिप: धीरज का इलाज करने के लिए याद रखें, यह बहुत ही निराशाजनक हो सकता है यदि आप नहीं जानते कि ऐसी चीज मौजूद है।

अच्छा बिंदु @ कियलोतन, सहमत हैं कि कुछ मामलों में इस अतिरिक्त डेटा से बचा नहीं जा सकता है; लेकिन अगर मैं खुद को एक पैकेट में कई
ऐरे जोड़ते हुए पाऊं

1

यह समस्या Google और Facebook द्वारा हल की गई है:

  1. Google का प्रोटोकॉल बफ़र्स - Google C ++ का एक बड़ा उपयोगकर्ता है:

    प्रोटोकॉल बफ़र्स एक कुशल अभी तक एक्स्टेंसिबल प्रारूप में संरचित डेटा को एन्कोड करने का एक तरीका है। Google अपने लगभग सभी आंतरिक RPC प्रोटोकॉल और फ़ाइल स्वरूपों के लिए प्रोटोकॉल बफ़र्स का उपयोग करता है।

  2. अपाचे थ्रिफ्ट (पूर्व में फेसबुक द्वारा):

    थ्रिफ्ट स्केलेबल क्रॉस-भाषा सेवाओं के विकास के लिए एक सॉफ्टवेयर ढांचा है। यह सी + +, जावा, पायथन, पीएचपी, रूबी, एर्लांग, पर्ल, हास्केल, सी #, कोको, जावास्क्रिप्ट, नोड्स .js, स्मॉलटाकल, और ओकेएमएल के बीच कुशलतापूर्वक और निर्बाध रूप से काम करने वाली सेवाओं के निर्माण के लिए एक कोड जनरेशन इंजन के साथ एक सॉफ्टवेयर स्टैक को जोड़ती है।


Google के प्रोटोकॉल बफ़र्स बड़े पैमाने पर, रीयल टाइम गेम के लिए बहुत धीमे हैं। हालांकि, मुझे संस्करण के कारण प्रोटोटाइप और छोटे खिलाड़ी संख्या के लिए काफी अच्छा लगा। हमेशा की तरह, आपका प्रोफाइलर असली कहानी बताएगा।
पैट्रिक ह्यूजेस

ठीक है, वे Google के लिए काफी अच्छे हैं, और Google बहुत अच्छी तरह से तराजू, और जब मैंने उनका उपयोग किया तो उन्होंने अच्छी तरह से काम किया। इसलिए मैंने उनकी सिफारिश की।
एक भुगतान किया बेवकूफ

Google को वास्तविक समय प्रदर्शन की आवश्यकता नहीं है। Google को विश्वसनीयता और अप-टाइम की आवश्यकता होती है, दोनों को प्रोटोकॉल बफ़र्स द्वारा अच्छी तरह से परोसा जाता है। यह सब घटने वाली वर्जनिंग और बॉयलरप्लेट कोड जनरेशन की जटिलता ओवरहेड जोड़ता है और जब आप 50-100msec अंतराल पर 1000 अपडेट भेजते और प्राप्त कर रहे होते हैं तो यह जुड़ जाता है। प्रोफाइल एक प्रोटोकॉल बफ़र कई कोड पुराने कोडर के विपरीत है जो हाथ में डेटा के लिए विशिष्ट है। @ वास्तव में005 का सार है।
पैट्रिक ह्यूजेस

+1, क्योंकि ये प्रारूप बहुत अधिक बड़े और अधिकांश वास्तविक-समय या उच्च-बैंडविड्थ वाले गेम के लिए धीमा हैं (अतिरिक्त जानकारी रखने के कारण जो आपको मनमाने ढंग से जटिल पैकेट को फिर से संगठित करने की अनुमति देता है), यह कहना कि वे उपयोगी नहीं हैं कुछ खेल, जैसे। बारी आधारित हैं। यदि हर संसाधन का अनुकूलन आवश्यक नहीं है, तो ये प्रारूप आपको बहुत समय बचा सकते हैं, और वे निश्चित रूप से JSON से अधिक कुशल हैं।
काइलोटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.