नियमित अंतरालों में MMOs में सभी लॉग इन वर्णों को सहेजने का प्रदर्शन लाभ क्या है?


26

MMORPGs के बहुमत में एक संसारों की प्रणाली है जो हर X घंटे में एक बार सभी वर्णों को बचाएगा। मुझे लगता है कि इसका कारण प्रदर्शन है। तो वियोग पर एक चरित्र को बचाने की तुलना में यह बेहतर, प्रदर्शन बुद्धिमान क्यों है?


34
यह प्रदर्शन के लिए नहीं है; यह शुद्धता के लिए थोड़ा सा प्रदर्शन कर रहा है , जो अधिक महत्वपूर्ण है।
मेसन व्हीलर

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

4
@ पूरी तरह से, यह सच नहीं है। एक MMO में हर क्रिया तुरंत स्मृति में होती है, लेकिन यह क्षणिक है। SSDs के साथ लगातार स्टोरेज के लिए सब कुछ सीधे सहेजना अभी भी बहुत महंगा है। यहां तक ​​कि उन खेलों के साथ जो सीधे डेटाबेस में सहेजते हैं, डेटाबेस स्वयं उस डेटा को डिस्क में सहेजता नहीं है (या कम से कम सिर्फ एक लेन-देन लॉग बचाता है, न कि सुसंगत डेटा - यह एक दुर्घटना पर फिर से बनाने की जरूरत है, और काफी लेता है थोड़ा समय)। लेकिन डिस्कनेक्ट पर बचत एक और कारण के लिए एक बुरा विचार है - स्थिरता।
लुआं

1
मुझे लगा कि यह सवाल वास्तविक समय में अंतराल बनाम पात्रों को बचाने के प्रदर्शन के लाभ के तर्ज पर अधिक होने वाला है।
एंथनी

2
@ लुअन: मैकेनिकल एचडीडी पर भी हर राज्य परिवर्तन को लगातार स्टोरेज में सहेजना पूरी तरह से संभव है। (आपको व्यस्त सर्वर पर कुछ की आवश्यकता हो सकती है)। चाल व्यक्तिगत वस्तुओं को अद्यतन नहीं करने के लिए है । इसके बजाय, आप एक लेन-देन लॉग सहेजते हैं "प्लेयर (ए)। इन्वेंटरी + = ऑब्जेक्ट (बी)`। समय-समय पर आप पूर्ण राज्य को फ्लॉ करते हैं। पुनर्प्राप्त करने के लिए, आप नवीनतम पूर्ण बचत को पुनः लोड करते हैं और लेन-देन लॉग से नवीनतम लेनदेन को लागू करते हैं। क्रमिक रूप से एक फ़ाइल लिखना, आप मैकेनिकल एचडीडी के लिए चरम प्रदर्शन तक पहुंचते हैं। लेकिन लेन-देन लॉग को उचित आकार में रखने के लिए, आपको आवधिक पूर्ण बचत की आवश्यकता होती है।
मर्सलेट्स

जवाबों:


66

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

डिस्कनेक्ट पर सहेजने से, यदि सर्वर में कोई समस्या है, तो हर कोई अपना सबकुछ खो देगा क्योंकि उन्होंने लॉग ऑन किया था। खासतौर से लंबे प्ले सेशन पर (जैसा कि पैराग्राफ में आम है), वे डेटा की एक महत्वपूर्ण राशि खो देंगे।

वे बड़े पैमाने पर डेटा हानि के जोखिम को दूर करने के लिए थोड़ा प्रदर्शन करते हैं।

बेशक, आप ग्राहक मशीनों पर नेटवर्क ट्रैफ़िक को कम करके आसानी से प्लेयर डेटा स्टोर कर सकते हैं। यहां मुद्दा यह है कि यह हैकिंग के लिए खुला है। एक बार जब कोई व्यक्ति धोखा देने के लिए काम करता है, तो वे इसे साझा करते हैं और हर कोई इसे कर रहा है।


संपादित करें: जैसा कि @Pippipp ने बताया है, यह आइटमों को डुप्लिकेट करने की क्षमता को भी हटाता है। सेव-ऑन-डिसकनेक्ट सिस्टम के साथ यदि सर्वर क्रैश से पहले लेन-देन किया जाता है और क्रैश से पहले एक व्यक्ति लॉग आउट होता है, तो दोनों खिलाड़ी अंतिम बार जब वे लॉग आउट होते हैं, तो आइटम को हटाते हैं या उन्हें डुप्लिकेट करते हैं।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
जोश

5

आरंभिक सिस्टम जो केवल डिस्कनेक्ट पर सहेजे जाते थे, समय-समय पर खिलाड़ी को सक्रिय रहते हुए भी बचाते थे। उन प्रणालियों में, आमतौर पर MUDs (मल्टी-यूजर डंगे), चरित्र को स्मृति में बनाए रखा जाता था जब तक कि उन्हें समय-समय पर किसी फ़ाइल में डंप नहीं किया जाता था।

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

सिस्टम ने अपने इच्छित उद्देश्य के लिए काम किया, क्योंकि वर्ण एक दूसरे के साथ बातचीत नहीं कर सकते हैं, संभवतः "मेल" प्रणाली के माध्यम से जहां वे एक दूसरे को संदेश और आइटम भेज सकते थे। आइटम खोने का मौका और प्रगति काफी महत्वपूर्ण है, लेकिन ज्यादातर मामलों में एक समय में केवल एक चरित्र को प्रभावित किया।

विश्वव्यापी विशेषता के बारे में आया क्योंकि अक्षर अंततः एक-दूसरे के साथ सीधे बातचीत करने में सक्षम थे, इसलिए सभी पात्रों को एक सुसंगत स्थिति में होना चाहिए, या आइटम दोहराव और विलोपन हो सकता था। यह MUD परिदृश्य में कोई समस्या नहीं थी, क्योंकि इस तरह से सिस्टम का दुरुपयोग करना मुश्किल था, जिसके परिणामस्वरूप आइटम या मुद्रा दोहराव था, लेकिन शुरुआती MMO MUD में ऐसा करना अविश्वसनीय रूप से आसान था। प्लेयर ए खिलाड़ी बी को एक आइटम देता है, खिलाड़ी बी को बचाता है और खिलाड़ी ए को बचाने के बिना डिस्कनेक्ट करता है। झटपट दोहराव।

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

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

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

एक आधुनिक MMO डिजाइन करते समय, आप डेटाबेस में संग्रहीत कार्यविधियाँ बनाना चाहेंगे, और लेनदेन करने के लिए उन प्रक्रियाओं का उपयोग करेंगे। उदाहरण के लिए, दो खिलाड़ियों के बीच व्यापार करते समय, यह इस तरह दिख सकता है:

start transaction;
insert into inventory (playerid, itemid) values (111, 222);
delete from inventory where playerid=111 and itemid=444;
insert into inventory (playerid, itemid) values (333, 444);
delete from inventory where playerid=333 and itemid=222;
commit;

(नोट: यह एसक्यूएल, व्यावहारिक रूप से नहीं लिखा गया है और केवल एक उदाहरण के लिए है)।

इस तरह, यदि प्रतिबद्ध होने से पहले कोई दुर्घटना होती है, तो सिस्टम एक ऐसी स्थिति में वापस आ जाता है जहां खिलाड़ी 111 और खिलाड़ी 333 के पास अभी भी मूल आइटम हैं, जबकि प्रतिबद्ध होने के बाद, व्यापार पूरा हो गया है। दोहराव के लिए कोई अवसर नहीं है, क्योंकि वर्ण उसी समय सहेजे जाते हैं, जैसा कि डेटाबेस द्वारा गारंटीकृत है।

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