मुझे एक MMO में खिलाड़ियों की वास्तविक समय की स्थितियों को कैसे ट्रैक करना चाहिए?


14

आप एक MMORPG में खिलाड़ियों के पदों का ट्रैक कैसे रखते हैं? मैंने पढ़ा है कि आप या तो एक डेटाबेस का उपयोग कर सकते हैं या आप निर्देशांक को फ़ाइलों में संग्रहीत कर सकते हैं। मैंने डेटाबेस का उपयोग करने की कोशिश की, लेकिन यह धीमा था। खिलाड़ियों की स्थिति पर नज़र रखने के लिए फ़ाइलों का उपयोग कैसे किया जा सकता है?

जवाबों:


23

खिलाड़ियों की स्थिति पर नज़र रखने के लिए फ़ाइलों का उपयोग कैसे किया जा सकता है?

आप फ़ाइल को प्लेयर की स्थिति लिखते हैं। उदाहरण के लिए, यदि आप प्रत्येक खिलाड़ी को एक अद्वितीय संख्या (या GUID) के साथ पहचानते हैं, तो आप उस फ़ाइल नाम के रूप में उपयोग कर सकते हैं। फ़ाइल में, बस स्थिति डेटा को एक प्रारूप में लिखें जिसे आप बाद में पार्स कर सकते हैं। उदाहरण के लिए, 467239.txtहो सकता है 20, 3, 19कि खिलाड़ी # 467239 उस ( x, y, z ) स्थान पर हो।

यह नहीं है कि आप डेटाबेस के साथ क्या करेंगे, इससे अलग नहीं है, हालांकि - इस ऑपरेशन में एक डेटाबेस "धीमा" नहीं होना चाहिए, यह बहुत तेज़ होना चाहिए (शायद फाइलों की तुलना में तेज़, क्योंकि आपके पास अधिक डिस्क आईओ ओवरहेड या आईओ लॉकिंग है विवाद - यदि आपने प्रति फ़ाइल कई पदों को संग्रहीत किया है - एक फाइलसिस्टम-आधारित दृष्टिकोण में)।

शायद आप रनटाइम पर प्लेयर की स्थिति को स्टोर करने के लिए DB या फाइल सिस्टम का उपयोग करने की कोशिश कर रहे थे ? आपको ऐसा बिल्कुल नहीं करना चाहिए

रनटाइम के दौरान, आपके सर्वर में, खिलाड़ी की स्थिति को मेमोरी में रखा जाना चाहिए और वहां अपडेट किया जाना चाहिए, जैसा कि आप किसी अन्य प्रकार के गेम के साथ करेंगे। समय-समय पर उन्हें डिस्क या अन्य लगातार भंडारण में सहेजा जा सकता है - उदाहरण के लिए, जब खिलाड़ी आराम करता है, बचाता है या लॉग आउट करता है।

लेकिन हर अद्यतन को संग्रहीत करने के लिए हर खिलाड़ियों की स्थिति लिखना अनावश्यक और बेहद अक्षम है; यह कभी भी तेजी से पर्याप्त नहीं होगा जो "बड़े पैमाने पर" खिलाड़ी के समान हो।


1
हां, वास्तव में, मैं रन टाइम पर एक पोस्टग्रेक्यूएल में खिलाड़ी की स्थिति को बचा रहा था। लेकिन, अगर मैं इसे सर्वर मेमोरी में रखता हूं तो मैं ग्राहकों में स्थिति को कैसे अपडेट कर सकता हूं?
बैकेरी

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

1
मुझे यह कहने की बात याद आती है कि "इसे एक फ़ाइल के साथ करें", केवल यह समझाने के लिए कि यह वास्तव में डीबी का उपयोग करने से भी बदतर है और फिर यह बताना कि वास्तविक समस्या क्या है। आपको पहली जगह में उस बेकार फ़ाइल स्पष्टीकरण की आवश्यकता क्यों है? यह केवल आकस्मिक पाठक को भ्रमित करता है, जो किसी के लिए कोई लाभ नहीं है।
ओ ० '।

6
यह अतीत में मेरा अनुभव रहा है कि प्रत्यक्ष प्रश्नों को अनदेखा करना और बस इस बारे में व्याख्यान करने के लिए आगे बढ़ना कि मुझे क्या लगता है कि "सही तरीका" को अधिक टकराव होना चाहिए और ओपी को अपने मूल प्रश्न से कमजोर नींव से दूर होने के लिए कम ग्रहणशील बनाता है। से आ रहा है, वह सब है।

13

उपयोग करते समय स्थिति रैम में होनी चाहिए। (पूर्व: खिलाड़ी का चरित्र दुनिया में है) आप DB को ऑपरेटिंग मेमोरी के रूप में उपयोग नहीं कर सकते। वैसे आप कर सकते हैं, लेकिन यह भयानक होगा।

आपको नियमित रूप से पदों को बचाना चाहिए, लेकिन हर बार जब वे बदलते हैं तो नहीं।

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

खाली समय उपलब्ध होने पर 30 स्थिति सहेजें।

ग्राहकों के लिए के रूप में। उन्हें आपके सर्वर सॉफ़्टवेयर के कनेक्शन के माध्यम से (प्रासंगिक) गेम स्टेट अपडेट प्राप्त होना चाहिए। डीबी से नहीं ... यह अव्यवहारिक, धीमा, बुरा, बुरा होगा और बल परेशान होगा।


2
और हाँ उन परिस्थितियों से बचने के लिए एक अलग थ्रेड का उपयोग करें जहाँ डेटाबेस आपके गेम लूप के बाकी हिस्सों को ब्लॉक कर सकता है।
कोयोट

4

मेरे पास एक अलग धागा है जिसे मैं हर 500 या तो गेम टिक्स की फाइलों को सहेजने के लिए कतार में रखता हूं। अन्यथा, आपको रैम में सब कुछ स्टोर करना चाहिए।


4

मैं अपने सर्वर में क्या करता हूं, खिलाड़ियों की दिशा (वेक्टर) और अंतिम स्थिति को संग्रहीत करना है, अगर खिलाड़ी की गति है, तो मैं हर 2 सेकंड में खिलाड़ियों की नई स्थिति की गणना करता हूं।

क्लाइंट के पास निश्चित रूप से अपनी स्थिति है और इसे सर्वर को नई दिशा (वेक्टर) भेजता है।

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

यह सब निश्चित रूप से स्मृति में होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.