जवाबों:
हमने किया, उम्मीद है कि बेन ज़ेड उन कारणों की बेहतर व्याख्या करेगा, जो मैं वास्तव में हमारे डेटाबेस के मूल लेखक थे। लघु संस्करण यह है कि रिलेशनल डीबी गेम के लिए बहुत उपयोगी नहीं हैं क्योंकि वे कुशलता से भारी संरचित पदानुक्रमित डेटा को स्टोर नहीं कर सकते हैं, जो डेटा के विशाल बहुमत को सामान्य ऑपरेशन के लिए एक MMO जरूरतों को पूरा करता है। हम एक कस्टम ऑब्जेक्ट डेटाबेस और एक डिस्ट्रिब्यूटेड ट्रांजैक्शन प्रोसेसिंग सिस्टम का हिस्सा बनाना चुनते हैं, जो अब हमारे दो लाइव गेम्स के उत्पादन और पावर में है।
जैसे कि क्या आपको भी ऐसा ही करना चाहिए? शायद नहीं, कम से कम पहले तो नहीं। मैं अभी भी एसक्यूएल से बचने की वकालत करूंगा, लेकिन अब "नो एसक्यूएल" दुनिया में कई और विकल्प हैं जो कुछ साल पहले मौजूद नहीं थे।
उस ने कहा, अधिकांश MMO एसक्यूएल (रिलेशनल) डेटाबेस पर चलते हैं। मुझे पता है कि ईव कुछ बहु-टीबी RAMSANs के शीर्ष पर बैठे SQL सर्वर इंस्टॉलेशन पर चलता है (मैं शायद अपने जीवन में कभी भी उतना पैसा नहीं रखूंगा जितना उन चीजों की लागत है)।
संपादित करें: उम्मीद है कि वह मुझे यहां पोस्ट करने से मना नहीं करेंगे, लेकिन यह एक ब्लॉग प्रविष्टि है जिसमें हमने अपने डेटाबेस के बारे में GDC'08 में दी गई प्रस्तुति के बारे में कुछ लिंक और टिप्पणियां दी हैं।
ठीक है, यह उत्तर अवलोकन का अधिक है।
पूर्ण प्रकटीकरण मैंने MMORPG पर काम नहीं किया है। मैंने 2009 में शीर्ष 10 सबसे अधिक देखी जाने वाली साइटों में से एक पर काम किया है, और मैंने गेम इंजन कंपनी में काम किया है जो सोचा था कि वे MMORPG तकनीक बना रहे थे (मुझे नहीं पता कि क्या भेज दिया गया है)।
यदि आप उन कंपनियों को देखते हैं जिन्होंने बड़े पैमाने पर (Google, फेसबुक, ट्विटर, आदि) हासिल किया है, तो मुझे पता है कि वे गेम कंपनियां नहीं हैं, लेकिन वे इस स्थान को देखने के लायक हैं) दो चीजें हैं जो मुझे लगता है कि महत्वपूर्ण हैं।
एक बड़ी गलती किसी महंगी टर्नकी चीज को पकड़ना है और यह आपके लिए जादुई पैमाने की अपेक्षा करता है। यह उस तरह से काम नहीं करता है। स्केलिंग की कुंजी प्रत्येक नई चुनौती से उचित तरीके से निपटना है। आपको उन समाधानों का उपयोग करने के लिए लचीले आसान की आवश्यकता है जिन्हें आप आसानी से अंदर और बाहर ले जा सकते हैं।
इसलिए मेरी सलाह है कि अगर आपकी शुरुआत हो जाए, तो उससे निपटने के लिए कम से कम सिरदर्द का अनुभव करें।
असल में, दृष्टिकोणों की एक पूरी श्रृंखला है, और मुझे लगता है कि वे अपने डेवलपर्स के अनुभवों के आधार पर अधिक चुने गए हैं, जितना कि डेटाबेस के गुण। एक छोर पर, कई MMO मानक रिलेशनल डेटाबेस का उपयोग कर रहे हैं - जैसे। डार्क एज ऑफ़ कैमलॉट ने उपयोग / उपयोग किया है (क्या वे अभी भी जा रहे हैं?) MySQL , FreeRealms एक संशोधित Postgresqb आदि का उपयोग करते हैं ।
पैमाने के साथ आगे बढ़ते हुए, आपके पास गिल्ड वॉर्स हैं: वे SQL सर्वर का उपयोग करते हैं , लेकिन वे अपने डेटा को एक ही BLOB के रूप में चिपकाते हैं। इसका मतलब है कि वे अपने सामान्य द्विआधारी प्रारूपों के लाभ प्राप्त करते हैं जो एक डेटाबेस प्रदान करता है। कहने की जरूरत नहीं है, आप शायद इस दृष्टिकोण के कुछ नुकसान भी देख सकते हैं, लेकिन फ्लैट फ़ाइलों के साथ काम करने के लिए उपयोग की जाने वाली कंपनी के लिए, यह शायद अभी भी एक कदम है।
तब शायद कुछ औपचारिक नोएसक्यूएल दृष्टिकोणों का उपयोग करने वाले कुछ स्थान हैं, हालांकि अभी भी शुरुआती दिन हैं। फ़ार्मविले मेम्बेस का उपयोग करता है , जो उन्होंने उद्देश्य के लिए बनाया था, जाहिरा तौर पर मेमकेड के आधार पर। यह MongoDB, CouchDB, आदि की पसंद के साथ कई विशेषताएं साझा करता है। इन दृष्टिकोणों के साथ आप आमतौर पर अपने स्वयं के भंडारण स्वरूपों को रोल कर रहे हैं लेकिन वितरण, कैशिंग, अतिरेक, आदि का लाभ प्राप्त करते हैं।
कुछ अपने NoSQL को पूरी तरह से रोल कर रहे हैं: Cryptic ने कहा कि उन्होंने ऐसा ही कुछ किया है, लेकिन यह भी कहा कि वे इसे उत्पादन में उपयोग नहीं कर रहे थे। ( संपादित करें : लेकिन नीचे टिप्पणी देखें।)
और फिर आप उन लोगों के पास आते हैं जो फ्लैट टेक्स्ट या बाइनरी फ़ाइलों का उपयोग कर रहे हैं - जैसा कि मैं समझता हूं कि यह पुराने गेम जैसे कि अल्टिमा ऑनलाइन, एवरक्वेस्ट, आदि सभी इस मार्ग से नीचे चले गए, और गेम डेवलपमेंट अनुभव वाली एक कंपनी के लिए लेकिन बहुत कम डेटाबेस का अनुभव यह अच्छी तरह से काम करता है भी।
यह भी ध्यान दें कि आपको लगभग कभी भी अपने डेटाबेस को शब्द के कुछ ढीले अर्थों में लिखने के आसपास नहीं मिलता है - खेल में आपके पास हमेशा ऐसे डेटा होंगे जो आपको या तो इन-मेमोरी या ऑन-डिस्क को उन तरीकों से प्रबंधित करने की आवश्यकता होती है जो खुद को उधार नहीं देते हैं। जेनेरिक सॉफ्टवेयर के लिए। आप हर बार जब आप कुछ डेटा चाहते हैं तो आप एसक्यूएल क्वेश्चन नहीं कर सकते हैं, इसलिए आपको कोड में कोई फर्क नहीं पड़ता कि आपके द्वारा उपयोग किए जाने वाले बैक एंड में आपकी बहुत सारी जानकारी मिरर करने की आवश्यकता होगी।
बर्निंग सी के पाइरेट्स पर, हमने MySQL (हालांकि ईमानदारी से मैंने पोस्टग्रेट्स को प्राथमिकता दी होगी) के साथ घूर दिया और जब यह लोड के तहत नीचे गिरने लगा, तो हमने Microsoft SQL सर्वर पर स्विच किया। ईमानदारी से, हालांकि, मैं शायद भविष्य में फिर से उस मार्ग पर नहीं जाऊंगा। पॉट्स के अधिकांश डेटा को वैसे भी बनाए रखने से पहले पूर्व-क्रमबद्ध किया जाता है, इसलिए डीबी में जो कुछ है उसका एक बड़ा हिस्सा एक अतिवृद्धि कुंजी / मूल्य स्टोर से अधिक कुछ नहीं है। उसके शीर्ष पर, हमारी दृढ़ता परत से बेहतर प्रदर्शन प्राप्त करने के लिए, और डेटा को मेमोरी में कैसे कैश किया गया था, इसका बेहतर नियंत्रण करने के लिए, हमने एक कैशिंग सर्वर लिखना शुरू किया जो डेटाबेस के सामने बैठा था।
तो Kylotan बहुत सही है, आप कुछ स्तर पर अपने खुद के रोलिंग के आसपास नहीं जा रहे हैं। SQL रिलेशनल डेटाबेस सर्वर गेम के डेटा के उपयोग के तरीके के लिए डिज़ाइन नहीं किए गए हैं। संबंधपरक DB सर्वरों को संभालने के बजाय सभी डेटाबेस के अंत थे, हमें वास्तव में इस बारे में अधिक सोचना चाहिए था कि किसी उपकरण को चुनने से पहले हम क्या लाभ देख रहे थे।
अगली बार चारों ओर, मैं बर्कलेबीडी या कुछ अन्य नोएसक्यूएल-शैली डीबी जैसी चीजों में अधिक देखूंगा।
एक और ध्यान देने वाली बात यह है कि अगर आपके पास (अपेक्षाकृत) स्टैटिक डेटा सेट है, तो इसे डेटाबेस में स्टोर न करें! डेटाबेस में अपनी वर्तनी परिभाषाओं, आइटम परिभाषाओं, मानचित्रों आदि को संग्रहीत करने का वास्तव में कोई अच्छा कारण नहीं है। आप उन्हें नाम के अलावा शायद ही कभी क्वेरी कर रहे हैं। मैं बहुत सारे लोगों को खेल के विकास में कूदते हुए देखता हूं कि ये खिलाड़ी डेटा के साथ-साथ सही हैं, और यह चीजों की पूरी तरह से अलग श्रेणी है।
इनके लिए आपको एक फाइल स्टोर की तरह डेटा स्टोर की आवश्यकता होती है। विकास के बाहर, आपको ACID की आवश्यकता नहीं है, आपको CRUD की आवश्यकता नहीं है, आपको उस तरह के डेटा के लिए डेटाबेस की आवश्यकता नहीं है। विकास के अंदर, आपको एक डेटाबेस की आवश्यकता होती है, लेकिन आपको वैसे भी VCS की आवश्यकता होती है, और VCS की आपकी पसंद आपके लिए डेटाबेस का विकल्प बनाएगी।
(यदि आप एक ऐसे खेल पर काम कर रहे हैं जहां खिलाड़ी कस्टम मंत्र या आइटम या quests बना सकते हैं, ठीक है, तो वह डेटा प्लेयर डेटा के समान है, और आपको फिर से डेटाबेस की आवश्यकता है।)
MMORPGs गहन ऐप हैं और एक बहुत बड़ा उपक्रम हैं। यदि आप खेल विकास के साथ शुरुआत कर रहे हैं तो मैं दृढ़ता से आपको कुछ छोटा करने की सलाह देता हूं।
कहा कि आपको अपने सेटअप से दो निचोड़ शीर्ष प्रदर्शन की आवश्यकता होगी। आपको स्पष्ट रूप से सर्वर फ़ार्म / हाइव की आवश्यकता है। क्योंकि नेटवर्क संचार अपेक्षाकृत महंगा है (और अधिकांश MMORPG रियलटाइम हैं) आप अपने केंद्रीय डेटाबेस को अपने प्रत्येक गेम सर्वर (अपनी पसंद के डेटाबेस में रीयलटाइम कम-विलंबता प्रतिकृति के बराबर) के रूप में बदलना चाह सकते हैं।
यदि आपका प्रत्येक सर्वर खेल की दुनिया के एक विशिष्ट खंड (जैसे वाह काम करता है) की सेवा कर रहा है; डिस्ट्रिब्यूटेड व्यूज जैसा कुछ । DPV आपको विभिन्न सर्वरों में अपने डेटाबेस की पंक्तियों को विभाजित करने की अनुमति देता है; प्रत्येक सर्वर पर कॉलम पर बाधाओं के अनुसार। MSSQL और Oracle दोनों ही स्मार्ट हैं जो केवल उस सर्वर से बात करते हैं जिसमें वह डेटा है जो आपके WHERE या ON क्लॉज में आता है। मुझे यकीन नहीं है कि किसी भी खुले स्रोत के प्रसाद में डीपीवी है।
इस सब का शुद्ध परिणाम यह है कि यह मायने नहीं रखता कि आप किस DB का उपयोग करते हैं , बस एक अच्छे नाम के साथ एक का उपयोग करें: MSSQL, Oracle, MySQL, PostgreSQL। अपने डेटाबेस को एएनएसआई एसक्यूएल में लिखें और देखें कि कौन सा सिस्टम सबसे अच्छा काम करता है - यह पता लगाने का एकमात्र तरीका है।
NoSQL मार्ग भी एक अच्छा विचार हो सकता है क्योंकि यह उच्च संगामिति के लिए डिज़ाइन किया गया है। हो सकता है कि प्रनी के सुझाव पर अमल किया जाए।
मैंने MongoDB (NoSQL) का उपयोग किया है, यह एक बहुत तेज़ दस्तावेज़ स्टोर है जिसे टीसीपी पर एक्सेस किया जा सकता है। कोशिश करो! यह विस्मयकारी है!
अपना DB लिखना एक कठिन काम है। मेरा सुझाव है कि आप पहले यह पता लगा लें कि वहां पहले से क्या है और यदि आप किसी भी ऐसी चीज को नहीं खोज सकते हैं जो आपके मानदंडों के विशिष्ट सेट से मेल खाती है, तो अपना खुद का निर्माण करें। ओह, और इसे स्रोत खोलना मत भूलना। :)
मुझे लगता है कि यह इस बात पर बहुत निर्भर करता है कि आपको किस तरह के डेटा को संग्रहीत करने की ज़रूरत है, और किस रूप में।
मुझे लगता है कि अधिकांश लोग "डायनामिक" डेटा के लिए "मानक" SQL डेटाबेस का उपयोग करते हैं जैसे कि प्लेयर informations, यह SQL सर्वर, MySQL, PostgfSQL है।
हालांकि, "आंतरिक" डेटा (दुनिया की स्थिति, सामग्री, ....) को किसी भी रूप में संग्रहीत किया जा सकता है, और मेरा अनुमान है कि अधिकांश कंपनी उस हिस्से के लिए कम से कम आंशिक रूप से कस्टम डेटाबेस सिस्टम लिखती है, जो उनकी विशिष्ट आवश्यकताओं के लिए अनुकूल है। ।
यह सवाल पुराना है, लेकिन इसे कैसे हैंडल किया जाए, यह मेरा आइडिया उतना ही मान्य है जितना कि आज पूछा गया।
यदि आप एक रिलेशनल डेटाबेस का उपयोग कर रहे हैं तो आपको इस पर लोड को कम करने की आवश्यकता है ताकि यह विचार मदद करे।
प्रत्येक क्लाइंट सिस्टम पर और साथ ही सर्वर DB में एक स्थानीय DB पर सभी सार्वजनिक जानकारी संग्रहीत करें।
क्लाइंट डेटाबेस पर आइटम के साथ सभी तालिकाओं को संग्रहीत करें। जब आप आँकड़ों के लिए उस हथियार पर माउस रखते हैं तो सर्वर की तलाश करने वाले ग्राहक के बजाय, ग्राहक आँकड़ों के लिए स्थानीय डेटाबेस की जाँच करता है। गणना करते समय आँकड़ों को खींचने के लिए सर्वर के पास अपना डेटाबेस होता है और ग्राहकों को शेष नुकसान और स्वास्थ्य के लिए बस।
इस विचार के साथ सबसे खराब मामला यह है कि यदि ग्राहक क्लाइंट डेटाबेस में आने का प्रबंधन करते हैं, तो सभी सभी हथियारों के आँकड़े देख सकते हैं। इससे कोई फर्क नहीं पड़ता कि भले ही वे मूल्यों को बदल दें, लेकिन सर्वर पर डेटाबेस मान गेम में गणना करने वाला क्या है।