बदलते खिलाड़ी डेटा के साथ-साथ बदलते डिजाइनर डेटा को प्रबंधित करने के तरीके


14

मेरे पास एक ऑनलाइन गेम है जहां खिलाड़ी किसी तरह से दुनिया को आकार देते हैं - जैसे। अल्टिमा ऑनलाइन का आवास, जहां आपको दुनिया के नक्शे के कुछ हिस्सों पर सीधे अपने घर बनाने के लिए मिलता है। ये ऐसे परिवर्तन हैं जो समय के साथ लगातार दुनिया में बने रहने चाहिए।

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

यह मानते हुए कि हम गेम डिज़ाइन के मुद्दों को ठीक करते हैं - उदाहरण के लिए। खिलाड़ी केवल निर्दिष्ट क्षेत्रों में निर्माण कर सकते हैं, इसलिए वे कभी भी भौगोलिक रूप से डिजाइनर संपादन से नहीं टकराते - हैं डेटा को संभालने या डेटा संरचनाओं को व्यवस्थित करने के लिए अच्छे तरीके क्या हैं ताकि टकराव से बचने के लिए जब नए डिजाइनर डेटा को नए खिलाड़ी डेटा के साथ विलय कर दिया जाए?

उदाहरण 1: एक खिलाड़ी एक नए प्रकार के आइटम को शिल्प करता है, और खेल इसे आईडी 123456 प्रदान करता है। उस आइटम के उदाहरण सभी वापस 123456 को संदर्भित करते हैं। अब कल्पना कीजिए कि गेम डिजाइनरों के पास एक समान प्रणाली है, और एक डिजाइनर एक नई वस्तु भी बनाता है जिसे 123456 भी गिना जाता है। इससे कैसे बचा जा सकता है?

उदाहरण 2: कोई एक लोकप्रिय मॉड बनाता है जो आपके सभी ड्रेगन को एक फ्रांसीसी उच्चारण देता है। इसमें एक नई वस्तु के साथ एक स्क्रिप्ट शामिल है, assignFrenchAccentजिसे वे प्रत्येक ड्रैगन ऑब्जेक्ट को नई आवाज परिसंपत्तियों को आवंटित करने के लिए उपयोग करते हैं। लेकिन आप अपने "नेपोलियन बनाम स्मॉग" डीएलसी को तैनात करने वाले हैं जिसमें एक ही नाम की एक वस्तु है - आप ग्राहक सेवा की बहुत सारी समस्याओं के बिना ऐसा कैसे कर सकते हैं?

मैंने निम्नलिखित रणनीतियों के बारे में सोचा है:

  • आप 2 अलग-अलग फ़ाइलों / निर्देशिकाओं / डेटाबेस का उपयोग कर सकते हैं, लेकिन तब आपके रीड ऑपरेशन काफी जटिल होते हैं। "सभी आइटम दिखाएं" को डिजाइनर DB पर पढ़ा हुआ एक प्रदर्शन करना होगा और एक खिलाड़ी DB पर पढ़ना होगा (और अभी भी 2 के बीच अंतर करना है, किसी तरह)।
  • आप एक स्टोर में 2 अलग नामस्थान का उपयोग कर सकते हैं, जैसे। प्राथमिक कुंजी के रूप में स्ट्रिंग्स का उपयोग करना और उन्हें "डिज़ाइन:" या "PLAYER:" के साथ उपसर्ग करना, लेकिन उन नामस्थानों को बनाना गैर-तुच्छ हो सकता है और निर्भरताएं स्पष्ट नहीं हैं। (उदा। आरडीबीएमएस में आप कुशलता से प्राथमिक कुंजी के रूप में तार का उपयोग करने में सक्षम नहीं हो सकते हैं। आप पूर्णांक का उपयोग कर सकते हैं और एक निश्चित संख्या के नीचे सभी प्राथमिक कुंजी आवंटित कर सकते हैं, जैसे 1 मिलियन, डिजाइनर डेटा, और उस बिंदु से ऊपर सब कुछ। खिलाड़ी डेटा। लेकिन वह जानकारी RDBMS के लिए अदृश्य है और विदेशी कुंजी लिंक 'डिवाइड' को पार कर जाएंगे, जिसका अर्थ है कि सभी टूलिंग और स्क्रिप्ट को इसके आसपास स्पष्ट रूप से काम करने की आवश्यकता है।)
  • आप हमेशा वास्तविक समय में एक ही साझा डेटाबेस पर काम कर सकते हैं, लेकिन प्रदर्शन खराब हो सकता है और खिलाड़ी डेटा को नुकसान का खतरा बढ़ सकता है। यह उन गेमों तक भी नहीं है जो विभिन्न विश्व डेटा के साथ 1 से अधिक सर्वर पर चलते हैं।
  • ... कोई अन्य विचार?

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

मैंने इसे "संस्करण नियंत्रण" के रूप में भी टैग किया है क्योंकि एक स्तर पर यह है - डेटा विकास की 2 शाखाएं जिन्हें विलय की आवश्यकता है। शायद कुछ अंतर्दृष्टि उस दिशा से आ सकती है।

EDIT - समस्या को स्पष्ट करने में मदद करने के लिए ऊपर दिए गए कुछ उदाहरण। मुझे लगता है कि इस मुद्दे को वास्तव में नामस्थान में से एक है, जो समग्र कुंजी के माध्यम से एक स्टोर में लागू किया जा सकता है। यह मर्ज की रणनीति को सरल करता है, कम से कम। लेकिन ऐसे विकल्प हो सकते हैं जिन्हें मैं नहीं देख रहा हूं।


1
मुझे लगता है कि इसका उत्तर कम से कम इस बात पर निर्भर कर सकता है कि डिजाइनर किस प्रकार के डेटा जोड़ रहे हैं और खिलाड़ी क्या जोड़ रहे हैं।
लथोमास ६४

यह हो सकता है, लेकिन मैं 2 पार्टियों के लिए जेनेरिक समाधानों में अधिक दिलचस्पी रखता हूं, दोनों एक ही डेटा स्टोर में योगदान कर रहे हैं।
काइलोटन

1
बहुत सारे लोग इस प्रश्न के बिंदु को याद कर रहे हैं - यह खिलाड़ियों के बदलाव नहीं हैं जो परस्पर विरोधी हैं: बल्कि सामग्री अपडेट आदि मौजूदा लेआउट को तोड़ रहे हैं। @ Kylotan क्या मैं सही हूँ?
जोनाथन डिकिंसन

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

2
आपने निर्दिष्ट नहीं किया, क्या आप किसी लाइव दुनिया के लिए रीयल-टाइम अपडेट करने की अपेक्षा कर रहे हैं? एक पक्ष नोट: एक डेटा स्टोर में योगदान करने वाले 2 पक्ष एक डेटाबेस है, जो कि डेटाबेस करते हैं, आप उस तथ्य के आसपास नहीं पहुंच सकते हैं और साझा डेटा के साथ समस्याओं से बचने के बारे में दशकों के ज्ञान को अनदेखा करना मूर्खतापूर्ण होगा।
पैट्रिक ह्यूजेस

जवाबों:


2

मुझे लगता है कि DB समाधानों के प्रस्ताव वाले उत्तर समस्या को समझे बिना एक विशिष्ट कार्यान्वयन के लिए कूद रहे हैं। डेटाबेस विलय को आसान नहीं बनाते हैं, वे आपको केवल एक ढांचा देते हैं जिसमें आपके डेटा को संग्रहीत किया जाता है। एक संघर्ष अभी भी एक संघर्ष है भले ही वह एक डीबी में हो। और चेक आउट करना एक गरीब आदमी की समस्या का हल है - यह काम करेगा, लेकिन आपकी उपयोगिता के लिए एक अपंग लागत पर।

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

प्रभावी रूप से आपके पास अपना मेनलाइन है - विहित, डेवलपर अनुमोदित संस्करण। आपके पास (शायद) अन्य शाखाएं भी हो सकती हैं - लाइव सर्वर थे लोग सक्रिय रूप से विकास कर रहे हैं और साझा कर रहे हैं। किसी भी शाखा में सामग्री जोड़ी जा सकती है। महत्वपूर्ण रूप से, आपके डिजाइनर यहां कुछ खास नहीं हैं - वे केवल सामग्री निर्माता हैं जो घर में रहते हैं (और आप उन्हें ढूंढ सकते हैं और जब वे पेंच करते हैं तो उन्हें मार सकते हैं)।

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

एक बार जब आप उस तरह के मॉडल के साथ काम कर रहे होते हैं, तो मर्ज संघर्ष से बचने के बारे में सभी सामान्य प्रक्रियाएं लागू होती हैं। अधिक स्पष्ट कुछ:

  • किसी विशेष लेखक / मॉड / टीम से रिंग-बाड़ सामग्री के लिए नाम-स्थान के उदार उपयोग को प्रोत्साहित करें।
  • जहां सामग्री को बातचीत करने की आवश्यकता है, स्पष्ट कॉलिंग / उपयोग सम्मेलनों, नामकरण परंपराओं, और अन्य ढीले 'नियम' स्थापित करें जो विकास को निर्देशित करते हैं ताकि वापस विलय करना आसान हो। यदि वे उन नियमों का पालन कर रहे हैं, तो सामग्री बनाने वाले को ऐसे उपकरण प्रदान करें, जो आदर्श रूप से सामग्री निर्माण में ही एकीकृत हों।
  • होने से पहले संभावित मर्ज विफल करने के लिए रिपोर्टिंग / विश्लेषण उपकरण प्रदान करें। इसे पोस्ट मर्ज ठीक करना शायद बहुत दर्दनाक है। इसे ऐसा बनाएं कि सामग्री की एक विशेष जाँच की जा सके और सभी को मर्ज-रेडी के रूप में स्पष्ट किया जा सके, ताकि मर्ज दर्द रहित हो
  • अपने विलय / एकीकरण को मजबूत बनाएं। आसान रोलबैक की अनुमति दें। मर्ज किए गए सामग्री का कठोर परीक्षण करें: यदि यह परीक्षण में विफल रहता है, तो इसे मर्ज न करें! या तो अपनी सामग्री या तुम्हारा तब तक मिलाएं जब तक कि मर्ज साफ-सफाई से आगे नहीं बढ़ जाएगा।
  • किसी भी चीज़ के लिए वृद्धिशील पूर्णांक आईडी का उपयोग करने से बचें (आपके पास उन्हें बनाने वालों को बाहर निकालने का विश्वसनीय तरीका नहीं है)। यह केवल एक DB में काम करता है क्योंकि DB खुद ID का एक विहित प्रदाता है ताकि आपको कभी भी डुप्लिकेट न मिले; हालाँकि यह आपके सिस्टम में विफलता / भार का एक भी बिंदु पेश करता है।
  • बजाय GUIDs का उपयोग करें - उन्हें स्टोर करने में अधिक लागत आती है, लेकिन मशीन विशिष्ट हैं और इसलिए टकराव का कारण नहीं होगा। वैकल्पिक रूप से स्ट्रिंग पहचानकर्ताओं का उपयोग करें, यह डिबग / रिज़ॉल्यूशन के लिए बहुत आसान है, लेकिन भंडारण और तुलना के लिए अधिक महंगा है।

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

ओह समझा। जब से आप उनके निर्माण उपकरणों को नियंत्रित करते हैं, कम से कम उन मर्ज-फ्रेंडली दृष्टिकोणों (नेमस्पेस, इत्यादि) को लागू करना कुछ ऐसा है जिसे आप उन खिलाड़ियों के बिना कर सकते हैं जो सहमत नहीं हैं।
MrCranky

यदि दो खिलाड़ी डुप्लिकेट सामग्री बनाते हैं तो आप क्या करते हैं? या आपके गेमवर्ल्ड के अलग-अलग उदाहरणों को अद्वितीय माना जाता है? जिस स्थिति में शायद यह हर उस अनोखे उदाहरण को स्वचालित रूप से जाँचने के लिए एक उपयोगी तरीका है, जिसे आप अपनी कोर / मेनलाइन शाखा के विरुद्ध जानते हैं, जो तब होता है जब आप उन परिवर्तनों को उदाहरणों से बाहर निकाल देते हैं। यदि आप खिलाड़ियों को नियंत्रित नहीं कर सकते हैं, तो आप कम से कम अपनी आंतरिक टीम को चेतावनी दे सकते हैं कि वे जिस काम को कर रहे हैं, वह दुनिया के उदाहरण X के साथ संघर्ष कर रहा है, विकास के शुरुआती दिनों में।
MrCranky

नाम स्थान की अवधारणा इतनी समस्या नहीं है - सभी संभावित नामस्थानों के नामस्थान से पर्याप्त नाम स्थान चुनना है! :) और मेरे लिए डुप्लिकेट सामग्री एक समस्या नहीं है - यह किसी चीज के सिर्फ 2 उदाहरण हैं जो समकक्ष हैं। महत्वपूर्ण बात यह है कि कोई भी हानिकारक मर्ज या ओवरराइट नहीं होते हैं। स्वचालित टकराव की जाँच के लिए, जो लिखने में किए गए नुकसान को रोकता है, लेकिन मूल नामकरण समस्या को हल नहीं करता है। (टकराव से बचने के लिए चीजों का नाम बदलना गैर-तुच्छ हो सकता है, क्रॉस-
रेफ़रिंग के

आह हाँ, मैं अब देख रहा हूँ, यह नाम की पसंद के रूप में खुद को इतना नाम स्थान नहीं है। उस मामले में, GUIDs शायद फिर से उत्तर हैं - सामग्री को प्रभावी ढंग से अपने छोटे क्षेत्र में रखा गया है। एक सजावटी नाम दिया जा सकता है, लेकिन खेल GUID का उपयोग करेगा।
MrCranky

1

माउंट पॉइंट्स के साथ सब कुछ एक विशेषता (या डेकोरेटर) के रूप में स्टोर करें। आइए एक ऐसे घर को लें जिसे खिलाड़ी ने एक उदाहरण के रूप में तैयार किया है:

o House: { Type = 105 } // Simple square cottage.
 o Mount point: South Wall:
  o Doodad: Chair { Displacement = 10cm }
   o Mount point: Seat:
    o Doodad: Pot Plant { Displacement = 0cm, Flower = Posies } // Work with me here :)
 o Mount point: North Wall:
  o Doodad: Table { Displacement = 1m }
    o Mount point: Left Edge:
     o Doodad: Food Bowl { Displacement = 20cm, Food = Meatballs}

तो प्रत्येक इकाई में एक या अधिक माउंट पॉइंट हो सकते हैं - प्रत्येक माउंट पॉइंट शून्य या अधिक अन्य घटकों को स्वीकार कर सकता है। इस डेटा को उस संस्करण के साथ संग्रहीत किया जाएगा जिसे यह किसी भी प्रासंगिक गुणों (जैसे मेरे उदाहरण में विस्थापन आदि) के साथ सहेजा गया था - NoSQL संभवतः यहाँ एक बहुत अच्छा फिट नहीं बनायेगा (Key = Entity ID, Value = Serialized Binary डेटा)।

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

यह सब बिल्कुल एक मुद्दा खुला छोड़ देता है: क्या होता है अगर दो वस्तुएं एक-दूसरे से टकराती हैं (उनके कंटेनर नहीं - माउंट पॉइंट आपको उस से बचाते हैं)? अपग्रेड के बाद आपको टकरावों की जांच करनी चाहिए और उन्हें हल करने का प्रयास करना चाहिए (चीजों को अलग करके, एसएटी की तरह थोड़ा सा)। यदि आप यह पता नहीं लगा सकते हैं कि टकराव को कैसे हल किया जाए, तो वस्तुओं में से एक को हटा दें और इसे एक स्टेश में रखें - जहां वे इन हटाए गए वस्तुओं को खरीद सकते हैं (मुफ्त में) या उन्हें बेच सकते हैं (पूरी कीमत पर); और स्पष्ट रूप से खिलाड़ी को सूचित करें कि उन्नयन ने उनके कुछ लेआउट को तोड़ दिया - संभवतः एक 'ज़ूम इन' सुविधा के साथ ताकि वे समस्या देख सकें।

अंततः आपको खिलाड़ियों के हाथों में जटिल परिवर्तन छोड़ना चाहिए (तेजी से विफल) क्योंकि कोई भी एल्गोरिथ्म सौंदर्यशास्त्र का हिसाब नहीं दे सकता है - आपको खिलाड़ी को केवल उस संदर्भ में सक्षम होना चाहिए, जहां आइटम हुआ करते थे (ताकि वे याद रख सकें, न कि सिर्फ इन सभी वस्तुओं को अपने स्टाॅस में रखें और न जाने कहां से)।


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

1

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

आपका सवाल लगभग 2 अनोखे सवालों की तरह लगता है:

  1. इस बात का बीमा कैसे करें कि वस्तु आईडी अद्वितीय हैं
  2. यह कैसे सुनिश्चित करें कि स्क्रिप्ट नाम स्थान टकराए नहीं

मैं एक अस्थायी संदर्भ प्रणाली के माध्यम से # 1 को हल करने की कोशिश करूंगा। उदाहरण के लिए, जब किसी व्यक्ति द्वारा कोई नई वस्तु बनाई जाती है, तो उसे अस्थिर या अस्थायी के रूप में चिह्नित किया जा सकता है। मुझे लगता है कि परीक्षण सर्वर पर बनाई गई सभी नई सामग्री को अस्थिर रूप में चिह्नित किया जाएगा (हालांकि यह गैर-वाष्पशील सामग्री का संदर्भ भी हो सकता है)।

जब आप लाइव सर्वर पर नई सामग्री लाने के लिए तैयार होते हैं, तो आपकी आयात प्रक्रिया में अस्थिर वस्तुएं मिलेंगी और उन्हें लाइव-सर्वर ऑब्जेक्ट आईडी बताएंगी जो कि पत्थर में सेट हैं। यह सीधे आयात / मर्ज से अलग है क्योंकि आपको मौजूदा गैर-वाष्पशील वस्तुओं को संदर्भित करने में सक्षम होने की आवश्यकता है जो आपको उन्हें ठीक करने या अपडेट करने की आवश्यकता है।

# 2 के लिए, ऐसा लगता है कि आपको इंटरमीडिएट स्क्रिप्ट ट्रांसमिटेशन के कुछ स्तर की आवश्यकता है जो फ़ंक्शन नाम को एक अद्वितीय नामस्थान पर रख सकता है। अर्थात

assignFrenchAccent

हो जाता है

_Z11assignFrenchAccent

0

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


0

मुझे लगता है कि 'चेक-आउट' प्रक्रिया के साथ वातावरण में दोहराया गया एक डेटाबेस / फाइलसिस्टम सबसे अच्छा होगा।

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

प्लेयर संपादन उसी तरह से काम करेगा, जब डेटाबेस / फाइलसिस्टम भूमिकाओं को उलट दिया जाएगा - वे उत्पादन डेटाबेस पर काम करते हैं, और समाप्त होने पर सभी अपडेट देव पर अपलोड किए जाते हैं।

एसेट लॉकिंग को उन संपत्तियों तक सीमित किया जा सकता है, जहां आप बिना किसी संघर्ष के गारंटी देना चाहते हैं: उदाहरण 1 में, ID 123456जैसे ही खिलाड़ी इसे तैयार करना शुरू करेगा , आप लॉक कर देंगे , इसलिए डेवलपर्स को उस आईडी को नहीं सौंपा जाएगा। उदाहरण 2 में आपके डेवलपर्स ने स्क्रिप्ट नाम assignFrenchAccentको विकास के दौरान लॉक कर दिया होगा , इसलिए खिलाड़ी को अपना संशोधन करते समय एक अलग नाम चुनना होगा (यह कि नामकरण द्वारा छोटे उपद्रव को कम किया जा सकता है, लेकिन यह कि जब तक आप प्रत्येक को नहीं देते तब तक आप टकराव से बचेंगे। उपयोगकर्ता / डेवलपर एक विशिष्ट नामस्थान, और फिर आपके पास नामस्थानों के प्रबंधन के साथ एक ही मुद्दा होगा)। इसका मतलब यह है कि सभी विकासों को एक ही ऑन-लाइन डेटाबेस से पढ़ना होगा, लेकिन इन उदाहरणों में आपको उस डेटाबेस से सभी की आवश्यकता होती है, ऑब्जेक्ट नाम हैं, इसलिए प्रदर्शन में कोई समस्या नहीं होनी चाहिए।

कार्यान्वयन के संदर्भ में, सभी कुंजियों और परिसंपत्ति राज्य (उपलब्ध, देव से बंद, ठेस से बंद) के साथ एक एकल तालिका होने से वातावरण में वास्तविक समय में सिंक्रनाइज़ / सुलभ पर्याप्त होना चाहिए। एक अधिक जटिल समाधान एक पूर्ण संस्करण नियंत्रण प्रणाली को लागू करेगा - आप एक मौजूदा प्रणाली का उपयोग कर सकते हैं जैसे सीवीएस या एसवीएन यदि आपकी संपत्ति सभी एक फाइलसिस्टम में है।


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

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

0

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

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

यह एक व्यापक रूप से जटिल मुद्दा है, सौभाग्य! वहाँ शायद कोई एक जवाब मौजूद नहीं है।


0

मुझे नहीं लगता कि यह एक समस्या है जैसा कि आप इसे बना रहे हैं।

मैं सिर्फ उपयोगकर्ता द्वारा बनाए गए मॉड को अधिलेखित करूंगा, एक चेतावनी के साथ कि "मॉड एक्स इस संस्करण के साथ सही ढंग से काम नहीं कर सकता है", इसे अपने काम को बदलने के लिए मॉड रचनाकारों पर छोड़ दें। मुझे नहीं लगता कि यह एक अवास्तविक उम्मीद है कि अपडेट कुछ मॉड को अक्षम कर सकता है।

उपयोगकर्ता द्वारा बनाई गई सामग्री के लिए भी, बस एक बैकअप बनाएं, और ओवरराइट करें।

मुझे इसमें कोई वास्तविक अनुभव नहीं है, सिर्फ सुझाव दे रहा हूं।


मुझे लगता है कि अगर यह विशुद्ध रूप से उपयोगकर्ता द्वारा प्रदत्त मॉड्स के लिए था, तो आप सही होंगे। लेकिन कुछ गेम स्पष्ट रूप से उपयोगकर्ता द्वारा बनाई गई सामग्री के बारे में हैं, और इसलिए आप इसे नष्ट नहीं कर सकते।
काइलोटन

तब आप जिस सामग्री को बाद में जोड़ सकते हैं उसके लिए सिस्टम में बस जगह छोड़ दें। यदि आप आईडी नंबर का उपयोग कर रहे हैं, तो 1-1000 आरक्षित करें। या यदि उपयोगकर्ता अपनी संपत्ति को नाम दे सकते हैं, तो उपयोगकर्ताओं को "अंतिम" या कुछ के साथ नाम शुरू न करने दें (इसे अपनी संपत्ति के लिए आरक्षित रखें)। संपादित करें: या बेहतर अभी तक, यह रिवर्स, एक सीमा या उपसर्ग में उपयोगकर्ता सामग्री के लिए मजबूर
वुडी Zantzinger
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.