क्लाइंट / सर्वर रियल-टाइम वीडियोगेम में तेज कंप्यूटर से कैसे निपटें


15

मैं socket.io का उपयोग करके अपना पहला ऑनलाइन गेम बना रहा हूं, और मैं इसे agar.io या diep.io की तरह एक वास्तविक समय मल्टीप्लेयर गेम बनाना चाहूंगा।

लेकिन मैं यह पता लगाने की कोशिश कर रहा हूं कि सभी कंप्यूटरों को एक ही गति से कैसे काम किया जाए।

मेरे पास मॉडल के लिए तीन विचार हैं, लेकिन उनमें से कोई भी सही नहीं लगता है, और मैं सोच रहा हूं कि सामान्य वीडियोगेम कैसे करते हैं। (आप मेरे विचारों को पढ़ना छोड़ सकते हैं; वे आपको केवल उन समस्याओं को देखने का एक तरीका देते हैं जो मुझे हो रही हैं।)

  1. सर्वर ग्राहकों को अपने आप चलने देता है और सर्वर को अपडेट पास करता है, जो बाद में उन्हें बाकी क्लाइंट के लिए प्रसारित करता है। यह समस्या है कि कुछ कंप्यूटर दूसरों की तुलना में तेजी से चलते हैं, जिससे वे तेजी से अपडेट होते हैं और तेजी से स्क्रीन के पार चले जाते हैं।

  2. अपडेट करने के लिए सर्वर को क्लाइंट्स को बताएं। मैं तब तक इंतजार कर सकता हूं जब तक कि अंतिम ग्राहक प्रतिक्रिया नहीं देता (एक व्यक्ति के पास एक धीमी गति से कंप्यूटर होने पर एक भयानक विचार), तब तक इंतजार करें जब तक कि पहले ग्राहक जवाब न दे (फिर से, प्रत्येक फ्रेम से पहले संचार की प्रतीक्षा कर रहा हो), या बस उन्हें जितनी जल्दी हो सके भेजें (जो नंबर 1 के रूप में एक ही मुद्दे में चलाने के लिए लगता है)।

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

मैंने कुछ शोध किया है , लेकिन मैंने जो लेख पढ़ा है, वह विशेष रूप से पता नहीं लगता कि क्या करना है अगर एक ग्राहक अन्य ग्राहकों की तुलना में तेजी से अपडेट भेजता है।

मेरे विशेष मामले में, मैं ऐसे लोगों के साथ काम कर रहा हूं जिनकी कीबोर्ड की गति अधिक है (उनका कंप्यूटर अन्य कंप्यूटरों की तुलना में अधिक कीबोर्ड अपडेट भेजेगा)।

प्रोग्रामर आमतौर पर इससे कैसे निपटते हैं?


1
मेरे अनुभव में, वे नहीं हैं। यही कारण है कि गेमर मशीनें मौजूद हैं; जो लोग आर्ट फ्लेम थ्रोअर के एक राज्य के लिए 5 भव्य भुगतान करते हैं, उनके पास स्वचालित रूप से कमोडोर 64 का उपयोग करने वाले लोगों का एक फायदा है।
रॉबर्ट हार्वे

1
तो मेरा गेम प्ले धीमा दिखाई देने वाला है क्योंकि हमें सबसे कम-सामान्य हर पर खेलना है? लगता है कि गेम सर्वर को टेम्पो सेट करना चाहिए और इसे क्लाइंट्स के पास रखना है या आपको बस पिछड़ना होगा।
जेएफओ

3
मैं इस प्रश्न को गलत समझ सकता हूं, लेकिन टिक आधारित क्लाइंट और सर्वर मॉडल का उपयोग करना संभवत: आप के बाद है। gamedev.stackexchange.com/questions/81608/… मूल रूप से आप केवल इनपुट प्रक्रिया और तर्क हर X राशि (आमतौर पर 1 / एन सेकंड, जैसे 1/60 60Hz तर्क के लिए)
क्रिस्टोफर विर्ट

4
प्रश्न को थोड़ा करीब से पढ़ने के बाद, ऐसा लगता है कि आप गेम के ग्राहक पहलुओं पर बहुत अधिक ध्यान केंद्रित कर रहे हैं। यदि आप एक "निष्पक्ष" मल्टीप्लेयर गेम चाहते हैं, तो आपके सर्वर को आधिकारिक होना चाहिए। मतलब कि क्लाइंट को होने वाली हर चीज को सर्वर द्वारा सत्यापित या किया जाता है। फिर आप यहां से चीजों को प्रतिबंधित करते हैं, शायद ऊपर के रूप में टिक आधारित प्रणाली के माध्यम से।
क्रिस्टोफर विर्ट

1
आह, वास्तविक समय नेटकोड। खेल विकास का सबसे गहरा, सबसे गहरा स्थान। जहाज में आपका स्वागत है, दोस्त!
टी। सार -

जवाबों:


8

आपका तीसरा विचार इस तरह की समस्या के लिए उद्योग समाधान के रूप में मैं जो सोचता हूं, उसके सबसे करीब लगता है।

आप जो वर्णन कर रहे हैं उसे आमतौर पर टिक्स कहा जाता है । प्रत्येक टिक में, सीरियल में प्रत्येक क्लाइंट के लिए एक निश्चित संख्या में कार्रवाई की जाएगी। अक्सर समय, गेम सर्वर में सक्षम होने पर कुछ समानांतर क्रियाएं होंगी, लेकिन यह बहुत अधिक जटिल समस्या है।

एक टिक के 1 / N सेकंड के रूप में होने की संभावना है, N प्रति सेकंड टिक्स की संख्या या टिकरेट की संख्या है। आपके उपयोग-मामले पर निर्भर करते हुए, यह गुदगुदी बहुत बार या बहुत बार हो सकती है। मेरा व्यक्तिगत सुझाव होगा कि आप 60 टिक / सेकंड से ऊपर की टिकिट से बचें जब तक कि आप सुनिश्चित न हों कि आपको और अधिक की आवश्यकता है। आप शायद नहीं :)

क्रियाएं परमाणु होनी चाहिए। उदाहरण के लिए, slither.io में, इस तरह के एक कदम के रूप में एक कदम तुरंत अपनी श्रृंखला को तोड़ने की तरह कुछ प्रक्रिया नहीं करनी चाहिए, जब तक कि आपके द्वारा मारा गया खिलाड़ी पहले ही अपना कदम नहीं उठा लेता है। यह पिक्सेल के स्तर पर कुछ के लिए तुच्छ लग सकता है, लेकिन यदि आप टाइल-आधारित आंदोलन के साथ काम कर रहे हैं, तो यह बहुत अधिक स्पष्ट हो जाता है, और निष्पक्षता सुनिश्चित करता है। यदि प्लेयर A को टाइल X, Y और प्लेयर B में ले जाता है, तो वह टाइल पर है, तो आपको यह सुनिश्चित करना होगा कि टिक के अंत तक, खिलाड़ी B उनके बीच होने वाले किसी भी कार्य के लिए उस टाइल पर रहेगा।

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

संदर्भ के लिए, यहां गेम सर्वर और मल्टीप्लेयर नेटवर्किंग की अपनी समझ के पूरक के लिए एक अच्छा लिंक है।

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


3
@ProQ यह ध्यान देने योग्य है कि अच्छा नेटकोड लिखना तुच्छ नहीं है! यदि आपका ऐप शुरू से अच्छी तरह से काम नहीं करता है और आपका नेटकोड चूसना लगता है, तो हार मत मानिए। यहां तक ​​कि जो लोग रोज़मर्रा के लिए करते हैं, उनके पास इसके मुद्दे हैं। यह सिर्फ इतना मुश्किल है!
टी। सार -

0

निम्न प्रणाली सुनिश्चित करती है कि सभी ग्राहक और सर्वर किसी भी समय लगभग एक ही गेम स्थिति साझा करें।

क्लाइंट और सर्वर दोनों पर गेम की स्थिति हो।

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

यदि यह है, तो भेजने वाले क्लाइंट को निष्पादित किए बिना, सर्वर को कमांड भेजें।

जब सर्वर कमांड प्राप्त करता है, तो खेल की अपनी स्थिति को देखें यदि यह वैध है।

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

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

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

जब कोई ग्राहक सिंक से बाहर होता है, तो सर्वर के पूरे गेम स्टेट की एक प्रति का अनुरोध करें, और उस एक का उपयोग करें। यदि ऐसा बहुत बार होता है, तो ठीक करें क्योंकि यह कमांड भेजने से अधिक महंगा है।

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

उस के शीर्ष पर, आप भविष्य कहनेवाला सिस्टम का उपयोग करके, आदेश समूहीकृत करके, केवल अलग-अलग आदि प्रस्तुत करके, बहुत कुछ अनुकूलित कर सकते हैं ...

उदाहरण के लिए, सत्यापन अलग होना चाहिए, यह कमांड अनुरोधों / समय इकाई को सीमित करने के लिए सर्वर पर निर्भर है।


0

मुझे नहीं पता कि यह आपके द्वारा उपयोग किए जा रहे पुस्तकालयों या पर्यावरण की समस्या है, लेकिन मुझे लगता है कि आप इसे पूरी तरह से गलत मान रहे हैं।

मल्टीप्लेयर गेम्स के बड़े पैमाने पर, यह केवल सर्वर है जो किसी भी वास्तविक गणना कर रहा है। ग्राहक केवल गूंगा आईओ मशीनें हैं जहां केवल वास्तविक प्रदर्शन समस्या 3 डी ग्राफिक्स ड्राइंग है। और यह मामला है कि अगर ग्राहक 20 या 200 एफपीएस पर चल सकता है, तो इससे कोई फर्क नहीं पड़ता, क्योंकि यह केवल दृश्य को प्रभावित करता है। इसका मतलब है कि "क्लाइंट अपडेट" का बिल्कुल कोई मतलब नहीं है। क्लाइंट यह अनुमान लगाने की कोशिश कर सकता है कि कौन सा सर्वर गणना कर सकता है, लेकिन यह केवल गेमप्ले की भावना को सुचारू करने के लिए है और गेमप्ले पर इसका कोई वास्तविक प्रभाव नहीं है।

तेज कीबोर्ड गति

मुझे यह भी नहीं पता कि इसका क्या मतलब है। अधिकांश लोग कम-की-बोर्ड की गति के साथ भी नहीं रख सकते हैं, तो यह खिलाड़ियों के प्रदर्शन को कैसे प्रभावित करेगा?

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


यदि आप "आगे बढ़ना" कुंजी या "शूट" कुंजी को दबाए रखते हैं, तो इसके बारे में तेज कीबोर्ड टाइपिंग के बारे में नहीं है, कितने कमांड भेजे जा सकते हैं।
gbjbaanb

@ जीबीजैनब और यह कैसे एक समस्या है? आपको केवल दबाए गए और जारी किए गए आदेशों की परवाह करनी चाहिए। आपको इस बात की परवाह नहीं करनी चाहिए कि यह कितनी तेजी से अद्यतन है।
व्यंग्यात्मक

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

@gbjbaanb नंबर गलत है। सर्वर को पता है कि "खिलाड़ी आगे बढ़ रहा है" और फिर हर 1/60 वें सेकंड में यह सभी खिलाड़ियों के पदों को अपडेट करता है, अगर वे आगे जा रहे हैं। इस तरह से सभी खेल काम करते हैं। अपडेट लूप गेम में सभी संस्थाओं के लिए समान है और अपडेट UI से घटनाओं पर आधारित नहीं हैं।
व्यंग्यात्मक

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