मैं नेटवर्क गेम में मजबूत तरीके से एंटिटी आईडी कैसे दे सकता हूं?


17

मैं एक नेटवर्क गेम के लिए एक इकाई प्रणाली पर काम कर रहा हूं और मैं प्रत्येक इकाई को एक अद्वितीय 32-बिट पूर्णांक आईडी प्रदान कर रहा हूं जिसका उपयोग मैं संस्थाओं और स्वयं संस्थाओं के संदर्भों को क्रमबद्ध करने के लिए कर सकता हूं।

वर्तमान में मैं हर बार एक इकाई बनाने पर एक काउंटर बढ़ा रहा हूँ। मुझे लगता है कि आईडी अंततः बाहर चला जाएगा, लेकिन मुझे वास्तव में 4 बिलियन संस्थाओं की उम्मीद नहीं है। यदि इकाई # 5 को नष्ट कर दिया जाता है, तो भी हम इस समस्या से बचते हैं और हमें 5. की एक आईडी मिलती है। क्या इसका मतलब नए # 5 या पुराने हटाए गए # 5 से है?

समस्या यह है कि मुझे यकीन नहीं है कि टकराव को कैसे संभालना / टालना है। वर्तमान में यदि कोई क्लाइंट किसी ऐसी ईट के साथ किसी इकाई के लिए अपडेट प्राप्त करता है, जो वर्तमान "फ्री आईडी" से अधिक है, तो यह केवल उसी ई-मेल को डाउनलोड करता है, जो पिछले है। लेकिन यह बहुत मजबूत नहीं लगता है।

मैंने सोचा कि शायद प्रत्येक ग्राहक को रेंज सौंपने के लिए ताकि वे बिना संघर्ष के संस्थाओं को आवंटित कर सकें (कहते हैं कि शीर्ष n बिट्स खिलाड़ी संख्या हैं), लेकिन मुझे चिंता है कि अगर समय के साथ सीमाएं ओवरलैप होने लगीं तो क्या होगा।

क्या इससे निपटने का एक बेहतर तरीका है? क्या मुझे आईडी की अतिप्रवाह या अनुमत सीमा के अंत में जाने की भी परवाह करनी चाहिए? मैं इन मामलों का पता लगाने के लिए कोड जोड़ सकता हूं, लेकिन अगर वे दुर्घटना के अलावा होते हैं तो यह क्या करेगा।

एक और विकल्प 128-बिट GUID की तरह अद्वितीय होने की उच्च संभावना के साथ कुछ का उपयोग करना है, लेकिन यह एक गेम के लिए वास्तव में भारी लगता है जो नेटवर्क ट्रैफ़िक को कम करने की कोशिश कर रहा है। इसके अलावा, वास्तविक रूप से मुझे कभी भी अधिक संस्थाओं की आवश्यकता नहीं होगी, फिर एक 32-बिट या यहां तक ​​कि 24 बिट पूर्णांक में फिट होगा।

धन्यवाद!


1
सभी ग्राहकों के पास समान इकाइयाँ क्यों नहीं हैं? क्या ग्राहकों को सिंक्रोनाइज़ नहीं किया जाता है? या यह किसी प्रकार का एक बड़ा संसार है जहाँ ग्राहक सभी एक ही खेल नहीं चलाते हैं।
फिलिप

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

1
मुझे लगता है, जैसा कि आप कहते हैं, इसे केवल सर्वर द्वारा नियंत्रित किया जाना चाहिए, यदि वह आपके दिए गए आर्किटेक्चर के भीतर सभी संभव हो। फिर फ्री एंट्री आईडी का एक स्टैक रखें जो कि यूनिट लिस्ट / मैप में अलग-अलग मौजूद हो, ताकि आपको पता चल सके कि आईडी क्या उपलब्ध है। एक आधिकारिक सर्वर मॉडल को विफल करना, फिर आपके रेंज किए गए दृष्टिकोण को सीमाओं के संदर्भ में ठीक काम करना चाहिए। चार बिलियन एक बहुत है, यहां तक ​​कि 4000 खिलाड़ियों को एक MMO में विभाजित करने के लिए। फिर उपलब्ध आईडी का ट्रैक रखने के लिए उसी दृष्टिकोण का उपयोग करें जैसे कि एक ऑउटफिट के साथ। सर्वर।
इंजीनियर

@ लुकास, आपका लिंक कहता है "सर्वर प्रत्येक क्लाइंट के लिए" प्रासंगिक "अभिनेताओं के सेट की पहचान करता है"। इसका मतलब यह है कि सर्वर सभी संस्थाओं के बारे में जानता है, और उनकी गणना करने की स्थिति में है।
काइलोटन

1
ज़रूर, लेकिन क्या होगा यदि कोई ग्राहक नई इकाई A बनाता है, लेकिन इससे पहले कि वह सृजन संदेश प्राप्त कर सके सर्वर नया निकाय B बनाता है, वे दोनों को एक ही "मुक्त" आईडी प्रदान करते हैं।
लुकास

जवाबों:


13

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

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

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


सभी अच्छी जानकारी के लिए धन्यवाद दोस्तों! मैंने समाप्त किया कि सर्वर के साथ जाना सभी संस्थाओं के दृष्टिकोण को बनाता है, लेकिन अगर मुझे लगता है कि बहुत विलंबता का परिचय देता हूं तो मैं ट्रेवर की विधि की कोशिश करूंगा।
लुकास

क्लाइंट विशिष्ट आईडी के लिए (सर्वर की प्रतीक्षा करते समय भविष्यवाणी के लिए आवश्यक) आप बस आईडी पर एक उपसर्ग का उपयोग कर सकते हैं।
danijar

6

जब मैंने एक वाणिज्यिक मल्टीप्लेयर गेम के लिए ऐसा किया था, तो मैंने वही किया था जो आप प्रस्तावित करते हैं: 32-बिट GUID पूर्णांक का उपयोग करें, जहां शीर्ष आठ बिट्स खिलाड़ी संख्या हैं, और नीचे के चौबीस बिट्स में स्थानीय रूप से अद्वितीय संख्या होती है।

यदि / जब स्थानीय संख्या ओवरफ्लो होती है (मेरे मामले में, तो यह लगभग कभी नहीं होगा; सामान्य उपयोग के तहत, इसे होने के लिए एकल नेटवर्क सत्र में चार से पांच दिन लगातार चलने के कारण होता है), मालिक एक भेज देगा "मेरे सभी ऑब्जेक्ट्स को रीसेट कर रहा है" संदेश, और शून्य से शुरू होने वाली सभी मौजूदा वस्तुओं को फिर से सेट करें। संदेश ने सभी साथियों को उनके द्वारा प्राप्त वस्तुओं को छोड़ने और उनके लिए फिर से क्वेरी करने के लिए कहा।

एक अधिक फैंसी दृष्टिकोण "ऑब्जेक्ट विथ GUID 'n' होगा। अब हर मौजूदा ऑब्जेक्ट के लिए GUID 'm'" संदेश के साथ ऑब्जेक्ट है। लेकिन मेरे मामले में, यह वास्तव में कभी भी होने की संभावना नहीं थी, और मुझे नहीं लगता था कि लोग वास्तव में दूरस्थ वस्तुओं को दुनिया से गायब हो जाएंगे, जो एक एकल नेटवर्क सत्र में पांच दिनों के नॉनस्टॉप खेलने के बाद आधे घंटे के लिए गायब हो जाएंगे। ;)


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

4

यदि आपके ग्राहक अपनी खुद की इकाइयां चला सकते हैं, तो मुझे लगता है कि आपके पास एक सहकर्मी से सहकर्मी मल्टीप्लेयर गेम है।

अगर ऐसा है, तो आपके पास बहुत अधिक ग्राहक नहीं हैं। निश्चित रूप से 256 से अधिक नहीं। और आपकी इकाई आईडी को 24 बिट्स में फिट होने की गारंटी है (16000000+ इकाइयां सभी के लिए पर्याप्त हैं!)। तो, ग्राहक की आईडी के बराबर अपनी आईडी का उच्चतम बाइट बनाएं:

entityId = clientId<<24 + (maxEntityIn++)

या कुछ और।

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


1

मैं अपने लगातार मल्टीप्लेयर गेम में 'सबसे भोली' विधि (प्रत्येक नई आईडी के लिए एक पूर्णांक बढ़ाता हूं) का उपयोग कर रहा हूं और यह ठीक काम करता है क्योंकि मैं क्लाइंट को नई आईडी बनाने की अनुमति नहीं देता: एस।

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

हमेशा की तरह, धोखाधड़ी को रोकने के लिए , सर्वर को सभी निर्माण और सत्यापन करना चाहिए ।

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