सीधे तौर पर "हाँ या ना कोज़ को स्वीकार न करें" मैंने ऐसा कहा था "यहाँ जवाब टाइप करें क्योंकि आप यूडीपी के साथ समस्याओं का एक समूह से लड़ने के लिए खुद को खोल रहे होंगे जो वास्तव में आपको सामना करने की आवश्यकता नहीं है।
अन्य उत्तरों में से कोई भी यहाँ यह साबित करने का स्पष्ट तरीका नहीं है।
कुछ सरल तथ्य लें
- IP हैडर 20 बाइट्स है चाहे आप किसी भी प्रोटोकॉल का उपयोग करें।
- यूडीपी हेडर 4 बाइट्स हैं
- टीसीपी हेडर 20 बाइट्स हैं
इसलिए हर बार जब आप एक बाइट का संदेश भेजते हैं, तो आपके द्वारा 25 या 41 बाइट्स की गई लाइन को प्रोटोकॉल के आधार पर एक आईपी हेडर मान लिया जाता है।
सूत्रों का कहना है:
मेरी सलाह
अपनी स्थिति लें जहां आपको क्लाइंट सर्वर इंटरैक्शन की आवश्यकता है, क्लाइंट की संख्या का अनुमान लगाएं, फिर उस डेटा के आधार पर गणित करें जो आप वास्तव में 2 के बीच भेजते हैं।
एक उदाहरण
आइए कहते हैं कि मैं अपने गेम में प्रति अपडेट 1 बाइट प्रति 10 संदेश भेजता हूं और मैं लगभग 60 एफपीएस अपडेट कर रहा हूं, इसलिए मुझे वास्तविक संदेश डेटा + प्रासंगिक हेडर के 60 * 10 = 600 बाइट प्रति सेकंड भेजने की आवश्यकता है।
अब खेल के आधार पर मैं यह कह सकता हूं कि सभी एक ही संदेश के रूप में टीसीपी परत से मेरा ओवरहेड सिर्फ 40 बाइट्स है (प्रभावी रूप से प्रति सेकंड 20 बाइट्स की यूडीपी पर एक लागत), यह नहीं होना कि ओवरहेड 600 बाइट्स की संभावित लागत है ( क्योंकि मुझे पूरी संदेश धारा को फिर से भेजना पड़ सकता है)।
हालांकि अगर यह महत्वपूर्ण रूप से महत्वपूर्ण है कि प्रत्येक संदेश को भेजे जाने के लिए तैयार होने वाले बहुत ही त्वरित रूप से भेजे जाने पर, मेरे पास 600 संदेश हैं (600 बाइट्स भी) + 40 * 600 = 24 k मूल्य का TCP ओवरहेड या ~ 14 k of UDP ओवरहेड प्रति सेकंड + संदेश डेटा के 600 बाइट्स।
फिर, हम सवाल पूछते हैं कि वे संदेश कितने महत्वपूर्ण हैं, वे कितनी बार हैं, और क्या ओवरहेड्स को कम करने के लिए उन्हें किसी तरह से बैचेन किया जा सकता है?
यह सिर्फ सिंगल बाइट संदेशों के एक समूह पर आधारित है, आमतौर पर आप कुछ अलग करते हैं, लेकिन कच्चे डेटा को बिना किसी कारण के साबित करने के लिए भेजा जाता है, अगर टीसीपी यूडीपी की तुलना में आपकी स्थिति के लिए बेहतर है।
तो, यह काम करेगा?
ठीक है, अगर आपके पास एक सामान्य एफपीएस है, और स्थिति महत्वपूर्ण है (धोखा या गलत निर्णयों से बचने के लिए), तो आपको यह जानना होगा कि आपका नेटवर्क स्ट्रीम वास्तविक है, लेकिन प्रत्येक खिलाड़ी को 24k + मैसेज बाइट करते हुए आगे और पीछे (जैसे 768KB) s + संदेश) ... यह एक 10mb / s ब्रॉडबैंड लाइन के बारे में है जो केवल अलग-अलग हेडर के लिए है, जो प्रत्येक क्लाइंट से एक सर्वर के माध्यम से प्रत्येक क्लाइंट से कम से कम 1 संदेश भेजने के आधार पर है।
आप स्पष्ट रूप से उस तरह से काम करने के लिए अपने सर्वर और क्लाइंट को कोड नहीं करेंगे और संदेश का आकार बहुत बड़ा होने की संभावना है और शायद ज्यादातर स्थितियों में प्रति फ्रेम 1 बाइट से थोड़ा कम अक्सर ऐसा होता है, इसलिए वास्तविक दुनिया को देखे बिना कहना मुश्किल है "यह वह डेटा है जिसे मुझे भेजने की आवश्यकता है" उदाहरण।
मेरा मामला
मैंने अपने मामले में कॉल किया है कि यह एक उचित ओवरहेड है, लेकिन यह इस बात पर आधारित है कि मैं अपने संदेश धाराओं का निर्माण कैसे करूं, इसलिए मेरे पास कुछ डिज़ाइनों की तुलना में भारी ओवरहेड्स नहीं हैं।
टीसीपी ठीक काम करती है और मेरे पास एक स्केलेबल MMO सर्वर और क्लाइंट फ्रेमवर्क है, लेकिन मुझे बहुत सारे डेटा को कभी भी फ्रेम या बहुत सारे छोटे पैकेट को स्ट्रीम करने की आवश्यकता नहीं है क्योंकि मैं अपने कॉल को बैच सकता हूं।
दूसरों के लिए: टीसीपी बस नहीं करेगा, और वे केवल यूडीपी का उपयोग कर सकते हैं, लेकिन यह स्वीकार करना होगा कि यह उन्हें इस बारे में आश्वासन नहीं देगा कि उन्हें क्या मिलता है (आदेश / आगमन की गारंटी)।
अन्य बातें
कई खराब कोडेड गेम इंजन सीपीयू पर मुख्य थ्रेड पर सब कुछ संभालते हैं इसलिए सीपीयू को अक्सर नेटवर्किंग कोड को संभालने के लिए केवल बहुत कम समय दिया जाता है, सेवा और ग्राहक दोनों का एक अच्छा कार्यान्वयन पूरी तरह से async और संभवतः धक्का होगा। संदेशों को बैचों में खींचो।
वहाँ कुछ अच्छी नेटवर्किंग लाइब्रेरी हैं, लेकिन जैसा कि यहाँ देखा गया है, कई लोगों की राय है कि UDP "बस बेहतर है", आपकी खुद की जरूरतों का अच्छा कारक है और यह मामला नहीं हो सकता है, और एक पुस्तकालय है जो ऐसा नहीं करता है जिस तरह से आप करते हैं उसमें चीजों का कारक यूडीपी वेरिएंट की तुलना में खराब तरीके से कोडित टीसीपी सेटअप में हो सकता है (क्योंकि मैं कह रहा हूं कि मैंने इसे देखा है, और लोड परीक्षणों ने इसे साबित कर दिया है)।
डेटा का पहला तकनीकी आधार बनाएं जिसे आप भेजना चाहते हैं और उसका परीक्षण करना चाहते हैं, फिर उसे स्केल करने के लिए गणित करते हैं, सबसे खराब स्थिति इसे क्लाउड पर तैनात करके परीक्षण करते हैं और 50 कंप्यूटर को एक परीक्षण क्लाइंट चलाते हैं यह देखने के लिए कि क्या यह संभाल सकता है प्रति गेम 32 खिलाड़ियों की आपकी सीमा (या आपकी जो भी सीमा हो)।