क्लाइंट और सर्वर दोनों पर भौतिकी सिमुलेशन चलाएं?


13

मैं खेल में क्लाइंट / सर्वर नेटवर्क आर्किटेक्चर के बारे में जानने के लिए एक मल्टीप्लेयर क्षुद्रग्रह क्लोन को लागू कर रहा हूं। मैंने अपने क्लाइंट / सर्वर तकनीक पर GafferOnGames और वाल्व के प्रकाशनों को पढ़ने में समय बिताया है। मुझे दो अवधारणाओं से परेशानी हो रही है।

  1. वर्तमान में मेरे पास एक आधिकारिक गेम सर्वर है जो बॉक्स 2 डी के साथ भौतिकी का अनुकरण कर रहा है और प्रति सेकंड 20 गुना ग्राहकों को दुनिया की स्थिति को बाहर भेज रहा है। प्रत्येक ग्राहक प्राप्त किए गए पिछले कुछ स्नैपशॉट का ट्रैक रखता है और स्प्राइट्स की गति को सुचारू करने के लिए दो राज्यों के बीच स्थित है। हालाँकि यह उतना सहज नहीं है। यह थोड़ी देर के लिए चिकना हो सकता है, फिर थोड़ा झटकेदार, फिर वापस चिकनी करने के लिए, आदि मैंने टीसीपी और यूडीपी दोनों की कोशिश की है, दोनों एक ही के बारे में हैं। किसी भी विचार मेरी समस्या क्या हो सकती है? (नोट: मैंने इसे पहले एकल खिलाड़ी के लिए लागू किया था, और स्प्राइट आंदोलन 60fps पर पूरी तरह से सुचारू है, जब भौतिकी दुनिया को प्रति सेकंड केवल 20 बार अपडेट कर रहा है)।

  2. पहली समस्या को हल करने के लिए मैंने सोचा कि शायद क्लाइंट को एक बॉक्स 2 डी सिमुलेशन चलाना चाहिए और जब वे मैच नहीं करते हैं तो सर्वर स्नैपशॉट से मिलान करने के लिए इसके स्प्राइट्स की स्थिति को अपडेट करें। मुझे लगा कि मेरे एकल खिलाड़ी कार्यान्वयन के सुचारू होने के बाद से यह चिकना हो सकता है। यह एक अच्छा विचार है?

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

धन्यवाद!

जवाबों:


10

निश्चित रूप से दोनों क्लाइंट और सर्वर पर सिमुलेशन चलाते हैं। किसी भी चीज की बहुत लंबी विलंबता होती है। आपको निश्चित होना चाहिए कि सिमुलेशन एक ही क्रम में वस्तुओं को सम्मिलित करके, एक निश्चित समय कदम का उपयोग करके और सूचक तुलना से बचने से मेल खाते हैं। मैंने Box2D के साथ यह कोशिश नहीं की है, लेकिन आमतौर पर एक भौतिकी सिमुलेशन में सभी मशीनों पर समान व्यवहार को प्राप्त करना संभव है। सभी गणित आमतौर पर IEEE 754 बाइनरी 32 फ़्लोट पर आधारित होते हैं और उनके व्यवहार को कड़ाई से संचालन के लिए परिभाषित किया जाता है जैसे कि +-*/कुछ का नाम। आपको सावधान रहने की जरूरत है sin,cosऔर कठिन पसंद, चूंकि वे रनटाइम्स के बीच भिन्न हो सकते हैं (यह कई प्लेटफार्मों के लिए विकसित होने पर विशेष रूप से महत्वपूर्ण है)। यह भी सुनिश्चित करें कि आप अपने संकलक में फ्लोट अनुकूलन के लिए एक सख्त सेटिंग का उपयोग करते हैं। आप सर्वर से ऑब्जेक्ट की स्थिति को समय-समय पर भेजकर ऑब्जेक्ट को सिंक्रनाइज़ कर सकते हैं। जब तक अंतर अनावश्यक हकलाने से बचने के लिए अंतर से बड़ा न हो, तब तक अपडेट न करें।

एक मुद्दा जो दिमाग में आता है वह है नई वस्तुओं का निर्माण और यह कि कैसे ग्राहकों के बीच अनुकरण को बदलेगा। इसे ठीक करने का एक तरीका सर्वर को सभी ऑब्जेक्ट बनाने देता है। यदि वर्तमान समय चरण है t, तो सर्वर किसी ऑब्जेक्ट को शेड्यूल किया जाएगा t+d। इस प्रकार, एक नई-वस्तु सूची, वस्तुओं को जोड़ने और उन्हें जोड़ने के लिए, सभी क्लाइंट पर बनाए रखा जा सकता है और सर्वर द्वारा अग्रिम में अच्छी तरह से अपडेट किया जा सकता है। यदि dआप पर्याप्त बड़े हैं, तो आप विभिन्न परिणामों के जोखिम को कम करते हैं। यदि आप वास्तव में उस अंतर को नहीं संभाल सकते हैं, तो आप किसी ग्राहक को उस समय कदम का अनुकरण करने से पहले एक निश्चित समय के लिए नई वस्तुओं के बारे में जानकारी के लिए प्रतीक्षा करने के लिए मजबूर कर सकते हैं।


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

आयलैंड Catto सोचता है, कि सिंक में कई Box2D दुनिया के पूरे राज्य रखने की कोशिश कर एक हारी हुई लड़ाई है ( box2d.org/forum/viewtopic.php?f=3&t=8462 )
पावेल

बयान "आईईईई 754 binary32 तैरता [..] व्यवहार सख्ती से संचालन के लिए इस तरह के रूप में परिभाषित है +-*/" पूरी तरह से गलत है। कार्यान्वयन के आधार पर IEEE-754 में उन सभी कार्यों में भिन्नता हो सकती है। अधिक जानकारी के लिए यहां और यहां देखें ।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

1
यह पूरी तरह सच है। आपके लिंक का वर्णन करने वाली समस्या x87 fpu के विभिन्न तरीकों और ट्रांसेंडेंटल्स के कार्यान्वयन से संबंधित है। IEEE 754 बाइनरी 32 को मूल संचालन के लिए कड़ाई से परिभाषित किया गया है। यह सही मोड सेट करने और सही निर्देशों का उपयोग करने के लिए आप पर निर्भर है ताकि मानक का पालन किया जाए। बस SSE निर्देशों का उपयोग कर रहा है न कि x87 fpu बहुत मदद करता है।
रास

4

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

नहीं है gamedev पर एक पुराने लेख बिंदु है जहां आप पिछले इसके लिए डेटा था अतीत किसी ऑब्जेक्ट की स्थिति की भविष्यवाणी करने के घन splines का उपयोग कर के बारे में। तब आप जो करते हैं, उस स्थिति का उपयोग करते हैं और फिर जब आपको नया डेटा मिलता है, तो उसकी नई स्थिति के बारे में जानकारी प्राप्त करने के लिए उस स्थान को समायोजित करें। यह शायद एक दूसरा भौतिकी सिमुलेशन चलाने की तुलना में बहुत सस्ता है, और इसका मतलब है कि आपको इस बारे में निर्णय लेने की ज़रूरत नहीं है कि आप किस पर भरोसा करते हैं, क्योंकि आपने स्पष्ट रूप से ग्राहक को इसे लागू करने के साथ ही इसे लागू किया है। :)


यह मामला हो सकता है। जब तक मैं सर्वर से 3 स्नैपशॉट प्राप्त नहीं कर लेता, तब तक मैं कोशिश कर रहा हूं। इस बिंदु पर मैं शॉट 1 से शॉट 2 से लेरप करता हूं। फिर शॉट 2 से शॉट 3 तक। 3. अगर किसी भी बिंदु पर मुझे एक पैकेट की याद आती है तो मैं 1 से 3 के बजाय 1 से 3 तक लेरप कर सकता हूं, अगर यह समझ में आता है। मैं इसे सही ढंग से लागू नहीं कर सकता हूं, हालांकि। लेख के लिंक के लिए धन्यवाद!
वेन्सेक्ट्रिक्स

1

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

बेशक, यहाँ समस्या यह है कि संस्थाओं पर कोई केंद्रीकृत नियंत्रण नहीं है, लेकिन मुझे लगता है कि यह सर्वर की तरफ और साथ ही साथ भौतिकी के सर्वर-साइड सिमुलेशन के द्वारा भी किया जा सकता है।


आपके सहयोग के लिए धन्यवाद। हमें धोखाधड़ी को रोकने के लिए केंद्रीकृत नियंत्रण की आवश्यकता होगी, इसलिए हमें सर्वर को एक सिमुलेशन चलाने के लिए कम से कम यह जानना होगा कि ग्राहक जो कहते हैं कि वे कर रहे हैं या नहीं।
वेन्सेक्ट्रिक्स

1

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

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

प्रश्न 1 के रूप में, मैं कहता हूं कि समस्या विलंबता पर उतार-चढ़ाव होगी, क्योंकि कोई पूर्ण गारंटी नहीं है कि स्नैपशॉट प्राप्त करने वाले प्रत्येक के बीच एक बिल्कुल सही 20 सेकंड का अंतराल होगा। मुझे उदाहरण दें (मिलीसेकंड में मापा गया समय "t"):

1) खेल शुरू होने के बाद से टी = 20 पर, ग्राहक ने एक स्नैपशॉट प्राप्त किया और प्रक्षेप को सफलतापूर्वक और सुचारू रूप से किया।

2) t = 40 में, सर्वर और क्लाइंट के बीच एक विलंबता थी, और स्नैपशॉट केवल t = 41 पर आने के लिए हुआ।

3) t = 60 पर, सर्वर ने एक और स्नैपशॉट भेजा, लेकिन अनुकार का एक सेकंड विलंबता के कारण क्लाइंटसाइड बर्बाद हो गया। यदि स्नैपशॉट t = 60 पर आता है, तो ग्राहक 40 और 60 इंस्टेंट का एक प्रक्षेप नहीं करेगा, लेकिन वास्तव में 41 से 60 तक के इंस्टेंट से, एक अलग व्यवहार उत्पन्न करता है। पर यह अक्षमता अंततः "झटका" का कारण हो सकता है।

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


मुझे यकीन नहीं है कि मैं आपके पहले पैराग्राफ में जो कह रहा हूं उसका पालन करता हूं। यदि सिमुलेशन केवल सर्वर पर चलता है और आप केवल वेग / त्वरण में परिवर्तन प्रसारित करते हैं तो क्लाइंट को कैसे पता चलता है कि स्प्राइट्स कहाँ खींचे जाने चाहिए? ग्राहकों को प्राप्त वेग / त्वरण के आधार पर वस्तुओं को अनुकरण करना होगा ताकि उन्हें ठीक से खींचा जा सके। मुझे लगता है कि आप अंतराल पर स्नैपशॉट प्राप्त करने के बारे में सही हो सकते हैं, जैसा कि मुझे उम्मीद है। किसी भी विचार से कैसे निपटना है?
वेन्सेक्ट्रिक्स

क्लाइंट्स ऑब्जेक्ट्स की प्रारंभिक और वर्तमान स्थिति, गति और त्वरण को जानते हैं, और यह उस स्थिति को अपडेट करेगा जो यह सोचती है कि ऑब्जेक्ट तदनुसार हैं (सर्वर से स्वतंत्र रूप से)। सर्वर अंततः संदेशों के माध्यम से ग्राहकों पर ऐसी संपत्तियों को बदल देगा, क्योंकि यह वह सर्वर है जो भौतिकी और टक्कर का पता लगा रहा है (जो दिए गए ऑब्जेक्ट की गति / त्वरण और दिशा को जल्द या बाद में बदलने के लिए बाध्य है)
UBSophung
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.