मल्टीप्लेयर एफपीएस सर्वर साइड प्रदर्शन


12

यह MMO प्रदर्शन से संबंधित है, सिवाय इसके कि बैंडविड्थ के बारे में प्रश्न है। यह सीपीयू लोड के बारे में है।

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

अभी, अगर मैं सर्वर से कई संबंध बनाता हूं, जहां प्रत्येक खिलाड़ी मंडलियों में कताई करते समय तेजी से गोली मारता है, तो मैं खेल में लगभग 15 - 20 खिलाड़ियों को प्राप्त कर सकता हूं, इससे पहले कि सर्वर एक कोर को अधिकतम करता है और नीचे की ओर धीमा हो जाता है। और यह है जब सर्वर पर 30 एफपीएस पर चल रहा है। 10 एफपीएस पर, मुझे लगभग 25 - 30 कनेक्शन मिलते हैं। यह बहुत बुरा है, क्योंकि खेल जल्द ही बहुत कुछ करने वाला है और मुझे इसके लिए अधिक खिलाड़ियों को फिट करने की आवश्यकता होगी ताकि यह संभव हो सके।

मेरे भाई ने अपने सहकर्मी के TF2 सर्वर के बारे में कुछ आंकड़े बताए। उसका सर्वर हमारी तुलना में कम चश्मा है, फिर भी यह TF2 चलाता है, जाहिर है एक अधिक जटिल गेम, प्रति सेकंड 500 टिक पर, 36 उपयोगकर्ता प्रति कोर के साथ। इसके अलावा, हम वर्तमान में उनकी तुलना में अधिक बैंडविड्थ का उपभोग करते हैं, लेकिन हम अभी तक इसे कम करने की कोशिश नहीं कर रहे हैं।

यह कैसे संभव है? इस परिमाण में सर्वर के प्रदर्शन को बढ़ाने के लिए किस तरह की चालें हैं? कुछ चीजें जिन्हें मैं जानता हूं उनमें शामिल हैं:

  • सर्वर पर फ्रैमरेट को कम करना, और क्लाइंट पर पदों को अलग करना। मुझे कुछ लाभ हुआ, लेकिन स्पष्ट रूप से TF2 सर्वर भी इससे परेशान नहीं है।
  • क्लाइंट पर टकराव का पता लगाने जैसी महंगी चीजें करना, और इसे सर्वर पर बार-बार सत्यापित करना। मैंने इसे अभी तक स्थानांतरित नहीं किया है, मैं आज रात करूंगा। यहां तक ​​कि मैं इस तरह के एक विशाल लाभ की उम्मीद नहीं है।
  • गणना को कम करने के लिए क्षेत्रों (क्वाड ट्री) में खेल के मैदान को तोड़ दें। अभी तक इसके लिए एक अवसर नहीं था।
  • मैंने दुर्भाग्यपूर्ण संभावना पर विचार किया है कि TF.js केवल जिस तरह से TF2 का उपयोग कर रहा है, उससे अधिक धीमा है, और इस तरह के उच्च तीव्रता वाले कार्य के लिए अनुकूल नहीं हो सकता है।
  • यह सब सर्वर कॉन्फ़िगरेशन जादू में है?

तो क्या सर्वर पर आवश्यक न्यूनतम करने के लिए उद्योग के अन्य चालें हैं लेकिन फिर भी एक निर्दोष खेल का अनुभव है? "सीपीयू को बचाने के लिए क्लाइंट को टालना" और "ग्राहक पर भरोसा न करना" के बीच एक बड़ा संघर्ष है, इसलिए शायद यह जानने में मदद मिलती है कि विभिन्न स्थितियों में लाइन कहाँ खींची गई है?

अपडेट करें

प्रोफाइलिंग वास्तव में एकमात्र मंत्र है जो मैंने कभी पाया है कि यह बिल्कुल अचूक है। मैंने अपने कोड (धन्यवाद, FP!) के आस-पास कुछ टाइमिंग फ़ंक्शंस को जल्दी से लपेट दिया और मुझे पता चला कि मैंने कभी भी उम्मीद नहीं की थी: लगभग सभी निष्पादन समय के लिए ग्राहकों के डेटा को प्रसारित करने का कार्य। विशेष रूप से, लगभग 90%। आगे के परीक्षण से पता चला कि यह समय ग्राहकों की संख्या और डेटा के आकार दोनों पर निर्भर है, लेकिन बाद में ऐसा होता है। एक 20 उपयोगकर्ता लोड पर, मैंने अपने प्रसारण समय को 90%, 24ms से घटाकर केवल 2ms से अधिक पूर्ण डेटा के बजाय केवल "{}" भेज दिया। लेकिन केवल 5 उपयोगकर्ताओं के साथ, प्रसारण में लगभग 0.5 एमएस लगता है। इसलिए मुझे स्पष्ट रूप से यहां कुछ अनुकूलन करने की आवश्यकता है।

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


5
प्रोफ़ाइल कोड वास्तव में सभी मैं सुझाव दे सकता है। मेरा अनुमान है कि इसका उतना बारीक अर्थ नहीं है जितना आपको लगता है और यही कारण है कि TF2 कम हार्डवेयर पर अधिक टिक दर चला रहा है। मुझे यह भी लगता है कि TF2 उन सभी चीजों को कर सकता है जो आपने करने का सुझाव दिया है और इसके परिणामस्वरूप उनका योगदान अधिक है।
नैट

1
मुझे आपके नवीनतम परिणाम सुनने में दिलचस्पी है, क्या आप नोड.जेएस से बेहतर प्रदर्शन प्राप्त करने में सक्षम थे?
iddqd

जवाबों:


5

आपके सर्वर को हर टिक पर सभी खिलाड़ियों के लिए सभी खिलाड़ियों की स्थिति नहीं भेजनी चाहिए। इसके बजाय इसे प्रत्येक क्लाइंट को प्रत्येक 500 ms को यह कहते हुए एक विशेष रूप से तैयार किया गया संदेश भेजना चाहिए कि "आपके व्यू पोर्ट में ये x खिलाड़ी 500 ms में इन निर्देशांक पर होना चाहिए।" अधिकांश समय यह ठीक काम करेगा, लेकिन अगर सर्वर को पता चलता है कि उसने गलत जानकारी दी है तो यह एक अतिरिक्त संदेश भेजता है।

इससे नेटवर्क ट्रैफिक में नाटकीय रूप से कमी आएगी।

सर्वर पर गेम टिक नहीं करने के लिए विचार करने के लिए एक और चीज है, लेकिन इसके बजाय क्लाइंट के पास केवल संदेश भेजते हैं जब एक कार्रवाई होती है (बदली हुई दिशा, गोली चलाई) और फिर एक कार्रवाई प्राप्त होने पर सर्वर पर आगे की गणना करें।


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

1

मैंने दुर्भाग्यपूर्ण संभावना पर विचार किया है कि TF.js केवल जिस तरह से TF2 का उपयोग कर रहा है, उससे अधिक धीमा है, और इस तरह के उच्च तीव्रता वाले कार्य के लिए अनुकूल नहीं हो सकता है।

शायद यही है। TF2 का सर्वर C / C ++ का उपयोग करते हुए लिखा गया है, और इस प्रकार, नोड की तुलना में तेज होने वाला है। जेएस (जो अगर मुझे सही याद है, जावा में व्याख्या की गई जावास्क्रिप्ट का उपयोग करता है)

Google का WebGL आधारित क्वेक सर्वर के लिए जावा का उपयोग करता है, और स्रोत कोड यहां पाया जाता है: http://code.google.com/p/quake2-gwt-port/ । यह देखने लायक है कि यह कैसे किया जाता है। मुझे आश्चर्य है कि जब आप सर्वर पर एक फ्रैमरेट की बात करते हैं तो आपका क्या मतलब होता है। सर्वर पर कुछ भी रेंडर करने का कोई कारण नहीं है, यह सिर्फ क्लाइंट द्वारा भेजे गए प्रोसेसिंग कमांड के लिए होना चाहिए।

अंत में, नियम "ग्राहक पर भरोसा नहीं करते" प्रदर्शन में सुधार की उम्मीद में ग्राहक पर महंगी गणनाओं को उतारने से अधिक महत्वपूर्ण है। टकराव का पता लगाने के लिए विशेष रूप से महत्वपूर्ण है। संदेह है कि जब आपका गेम जावास्क्रिप्ट आधारित है, और इस प्रकार हैक करने के लिए काफी आसान है (टीएफ 2 की तरह कुछ की तुलना में जो संकलित है)।

मुझे पता है कि यह जवाब नहीं है, लेकिन उम्मीद है कि यह आपको कुछ दिशाओं में इंगित करेगा जो प्रदर्शन को बेहतर बनाने में मदद कर सकते हैं।


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