2011-01-15 11 views
6

मैं जावास्क्रिप्ट में एक गेम लिख रहा हूं, और धोखाधड़ी को रोकने के लिए, मुझे सर्वर पर गेम खेला जा रहा है (यह एक बोर्ड गेम है जो अधिक जटिल चेकर्स की तरह है)। चूंकि गेम काफी जटिल है, इसलिए मुझे क्लाइंट क्रियाओं को सत्यापित करने के लिए गैमेस्टेट को स्टोर करने की आवश्यकता है।node.js gamestate भंडारण, कैसे?

क्या स्मृति में गैमेस्टेट को स्टोर करना संभव है? क्या वह स्मार्ट है? क्या मुझे ऐसा करना चाहिए? यदि हां, तो कैसे? मुझे नहीं पता कि यह कैसे काम करेगा।

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

मुझे क्या करना चाहिए?

+1

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

+0

@ मर्कस धन्यवाद, मैं कार्यान्वयन पर सलाह मांग रहा हूं क्योंकि यह मेरे लिए स्पष्ट नहीं है। मैं कोड में खेल स्थिति का प्रतिनिधित्व कैसे करूं? – expressnoob

+0

@expressnoob चर और कक्षाएं। ये उपकरण हैं, उन्हें अपने गेम में ऑब्जेक्ट्स का प्रतिनिधित्व करने के लिए उपयोग करें, जैसे 'गेम', 'प्लेयर',' टुकड़ा 'इत्यादि। डिज़ाइन आपके लिए नीचे है और आपके गेम के लिए विशिष्ट है। –

उत्तर

4

आप सच में, सच नहीं आई/ओ की भूमि के ऊपर तो बस एक वैश्विक वस्तु खेल आईडी से keyed में खेल राज्य की दुकान चाहते हैं:

var global_gamesate = {} 

तो प्रत्येक कनेक्शन पर खेल की जाँच क्या आईडी उसे खेल स्थिति पुनर्प्राप्त करना है:

var gamestate = global_gamestate[game_id]; 

संभवतः आपके पास पहले से ही गेम आईडी में क्लाइंट सत्रों को मैप करने के लिए एक तंत्र है।

आमतौर पर, गेम राज्य छोटा होता है और शायद ही कभी अधिक रैम लेता है। चलो निराशावादी हो और मान लें कि प्रत्येक गेम राज्य 500K लेता है। फिर आप अपने सर्वर पर रैम के प्रत्येक गीगाबाइट के लिए दो मिलियन हजार गेम (चार मिलियन हजार उपयोगकर्ता) यदि हम प्रति गेम दो उपयोगकर्ता मानते हैं) की सेवा कर सकते हैं।


हालांकि, मैं करते रहे कि MySQL जैसे डेटाबेस पहले से ही कैशिंग (जो विन्यास योग्य है) को लागू तो सर्वाधिक उपयोग होने वाले डेटा मूल रूप से एक छोटी सी सॉकेट आई/ओ भूमि के ऊपर के साथ राम से लोड करता है लोड हो रहा है करना चाहते हैं। डेटाबेस के फायदे यह है कि आपके पास रैम की तुलना में अधिक डेटा हो सकता है क्योंकि वे बाकी डिस्क को स्टोर करते हैं।

यदि आपका प्रोग्राम कभी भी लोड तक पहुंच जाता है जहां आप एक स्वैप फ़ाइल को लागू करने के लिए अपनी डिस्क-सीरियलाइजेशन एल्गोरिदम लिखने के बारे में सोचना शुरू करते हैं तो आप मूल रूप से पहिया का पुन: आविष्कार कर रहे हैं। किस मामले में मैं कहूंगा डेटाबेस के साथ जाओ।

+0

समवर्ती के बारे में क्या? यदि दो ग्राहक एक ही समय में एक ही वैश्विक खेल स्थिति को बदलना चाहते हैं, तो क्या वे एक दूसरे के साथ हस्तक्षेप नहीं करेंगे और राज्य को खराब कर देंगे? – Jeena

+0

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

+0

सहेजने का अच्छा तरीका क्या होगा उदाहरण के लिए सर्वर की स्थिति (सभी गेम की प्रगति और उनके उपयोगकर्ता) पुनः लोड पर? – Herokiller