बुलेट का उपयोग करते समय भौतिकी नेटवर्क पर सही ढंग से सिंक्रनाइज़ नहीं हो रही है


11

मैं बुलेट का उपयोग करके क्लाइंट / सर्वर भौतिकी प्रणाली को लागू करने की कोशिश कर रहा हूं, हालांकि मुझे चीजों को सिंक करने में समस्या आ रही है।

मैंने एक कस्टम मोशन स्टेट लागू किया है जो मेरे गेम ऑब्जेक्ट्स से ट्रांसफॉर्म को पढ़ता है और लिखता है और यह स्थानीय रूप से काम करता है लेकिन मैंने नेटवर्क गेम के लिए दो अलग-अलग तरीकों की कोशिश की है:

  1. क्लाइंट पर डायनामिक ऑब्जेक्ट जो सर्वर पर भी हैं (उदाहरण के लिए रैंडम मलबे और अन्य महत्वहीन सामान नहीं) कीनेमेटिक बनाए जाते हैं। यह सही ढंग से काम करता है लेकिन वस्तुएं बहुत आसानी से नहीं चलती हैं
  2. ऑब्जेक्ट दोनों पर गतिशील होते हैं, लेकिन सर्वर से प्रत्येक संदेश के बाद कि वस्तु को स्थानांतरित कर दिया है मैंने सर्वर से मानों को रैखिक और कोणीय वेग सेट किया है और btRigidBody कॉल करें :: सर्वर पर परिवर्तन के साथ आगे बढ़ें। मैं btCollisionObject भी कहता हूं: सक्रिय (सच्चा); वस्तु को अद्यतन करने के लिए बाध्य करना।

विधि 2 के साथ मेरा इरादा मूल रूप से विधि 1 करने का था, लेकिन एक गरीब आदमी की भविष्यवाणी करने के लिए बुलेट को हाईजैक करने की बजाय मेरी विधि 1 को सुचारू करने के लिए, लेकिन यह काम नहीं करता है (उन कारणों के लिए जो 100% स्पष्ट नहीं हैं मुझे भी बुलेट के माध्यम से कदम) और वस्तुओं को कभी-कभी अलग-अलग स्थानों पर समाप्त होता है।

क्या मैं सही दिशा में जा रहा हूं? लगता है कि बुलेट का अपना इंटरपोलेशन कोड बिल्ट-इन है। क्या इससे मुझे विधि 1 को बेहतर बनाने में मदद मिल सकती है? या मेरा तरीका 2 कोड काम नहीं कर रहा है क्योंकि मैं गलती से पेट भर रहा हूं?

संपादित करें: विधि 1 के साथ एक और समस्या मैंने अभी देखी है कि टकराव की प्रतिक्रिया गैर-सिंक्रनाइज़ ऑब्जेक्ट्स के खिलाफ टकराव के लिए बंद हो जाएगी। काइनेटिक पिंड कभी-कभी अनन्तता के लिए शूट का सामान होते हैं क्योंकि उन्हें वापस खटखटाया नहीं जा सकता।


कुछ चीजें जो आपको उत्तर देने में मदद कर सकती हैं: आप किस भाषा / इंजन का उपयोग कर रहे हैं? यह किस प्रकार का कनेक्शन है? सर्वर के लिए पिंग की तुलना में सिंक्रनाइज़ेशन घाटा कितना बुरा है?
फाइबरिकॉन

2
दूसरा विकल्प काम नहीं करता है क्योंकि आप केवल कुछ फ्रेम के बाद सर्वर वैल्यूज के लिए वेलोसिटी सेट करते हैं, इसलिए प्रत्येक पैकेट के बीच में कुछ फ्रेम होते हैं जहां चीजें बहाव कर सकती हैं। मैं खेल भौतिकी पर सभी वृद्ध की पोस्ट पढ़, तो आप शायद पहले पढ़ना चाहिए 'अपने timestep ठीक' की सिफारिश करेंगे, लेकिन यहाँ अंतिम लेख जो नेटवर्क भौतिक विज्ञान के बारे में बातचीत है gafferongames.com/game-physics/networked-physics
रॉय टी

मैं C ++ में एक स्व-विकसित इंजन का उपयोग कर रहा हूं। हालाँकि मुझे पूरा यकीन है कि सिंक्रोनाइज़ेशन की कमी इतनी बुरी नहीं है, शायद 1 फ्रेम ओवर पिंग है अगर मुझे अनुमान लगाना था लेकिन मैं अभी भी ज्यादातर LAN केवल परीक्षण कर रहा हूं। मैं उन लेखों की जाँच करूँगा और हाँ, आप सही हैं कि वेग बंद हैं। हालांकि बातें हैं जिस तरह से , बंद टोकरा की तरह नक्शे के पार है। स्पष्ट रूप से रूपांतरित करने वाली चीज़ को आम तौर पर अंतत: अनुरूप नहीं बनाना चाहिए? (भले ही यह बहुत सुंदर नहीं है, जिगल्स, आदि)
लुकास

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

एक दिलचस्प रीड, जो आंशिक रूप से आपके विषय से संबंधित है: gamasutra.com/view/feature/3094/… । इसके बारे में एक rts और इसके बारे में भौतिकी नहीं है, लेकिन वे उस बिंदु पर पहुंचते हैं, जहां उन्हें सर्वर और क्लाइंट पर एक सिमुलेशन सिंक करना पड़ता है। जिस तरह से वे ऐसा करते हैं? वे क्लाइंट और सर्वर दोनों पर स्वतंत्र सिमुलेशन चलाते हैं, लेकिन सर्वर उन पैकेजों को भेजता है जो यह सुनिश्चित करते हैं कि क्लाइंट सिमुलेशन डायवर्ज नहीं करता है और इसे ठीक किया जाता है, अगर ऐसा होता है ...
टॉम वैन ग्रीन

जवाबों:


4

आपको उचित क्लाइंट-साइड भविष्यवाणी की आवश्यकता है

आपको वास्तव में रॉय टी। के विवरण में पढ़ना चाहिए जो आपको उनकी टिप्पणी में प्रदान किया गया है । यह वर्णन करता है कि खिलाड़ी इनपुट और चरित्र भौतिकी के साथ क्या करना है, लेकिन सिद्धांत "सर्वर-संचालित भौतिकी" के लिए समान है।

इसे लागू करने के लिए तुच्छ नहीं है, लेकिन कुछ शब्दों में, खेल की वस्तुओं के लिए जो सिंक में होना चाहिए:

  • सर्वर और क्लाइंट दोनों पर भौतिकी चलाएँ;
  • सर्वर नियमित रूप से अपडेट भेजता है;
  • क्लाइंट निरंतर और सुचारू रूप से सर्वर मूल्यों के लिए अपनी भौतिकी दुनिया को फिर से समायोजित करता है।

तो हाँ, आप अपनी विधि के साथ सही दिशा में जा रहे हैं। 2. मानों को ओवरराइड करना पर्याप्त नहीं है, हालांकि, आपको क्लाइंट पर जंप मिलेंगे, आपको जो करने की आवश्यकता है वह आसानी से और सर्वर मूल्यों के लिए निरंतर प्रक्षेपित होता है।

आपके वास्तविक बग के लिए, मैं बुलेट से परिचित नहीं हूं, लेकिन आप शायद कुछ मूल्यों को याद कर रहे हैं जैसे कि आपने रैखिक और कोणीय वेग सेट किया है, लेकिन क्या आपने त्वरण सेट किया है?


धन्यवाद! इससे मुझे बेहतर महसूस होता है कि मैं सही रास्ते पर हूं। मैं अपने कोड के साथ अब ठीक दांतों की कंघी पर जाऊंगा। हो सकता है कि कुछ अधिसूचना को निकाल नहीं दिया जा रहा है या जैसा कि आप कहते हैं कि मुझे एक मान याद आ रहा है क्योंकि विधि 2 को (झटका) काम करना चाहिए।
लुकास

3

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

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

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


धन्यवाद, हाँ, इसके बारे में जाने का एक तरीका है। हालांकि यह ग्राहक पर उस सामान को भरने के लिए अच्छी टकराव प्रतिक्रियाओं का परिणाम नहीं होता है और यह भी कि वह कैंडी चीजों को हमेशा सही ढंग से इंटरैक्ट नहीं करेगा क्योंकि यह सर्वर की चीजों (कम से कम समय के भीतर) पर वापस नहीं चला सकता है। मुझे लगता है कि यह संभव होना चाहिए क्योंकि अवास्तविक और स्रोत जैसे इंजन ऐसा करने लगते हैं।
लुकास

आई कैंडी को सिंक करने की आवश्यकता नहीं है, यह प्रति-ग्राहक गणना की जा सकती है। क्लाइंट पर प्रतिक्रिया की गणना सर्वर पर की जाती है, क्लाइंट के लिए निर्देशांक की गणना की जाती है और वापस भेज दिया जाता है, आप ग्राहक को कॉलबैक यह कहते हुए नहीं भेजते हैं कि यह टकरा गया, जो शायद भयानक लगेगा।
tsturzl

2

नेटवर्क सिंक्रोनस भौतिकी दुनिया को लागू करना असंभव है। चरण N में छोटा सा अंतर N + 1 चरण N में अधिक बड़ा अंतर आप इसे सिंक रखने और यथार्थवादी दिखने के लिए बलों या आवेगों को लागू नहीं कर सकते।

समाधान:-

  1. आप वर्ण या रेसिंग कारों जैसी केवल कुछ वस्तुओं को सिंक करने पर विचार कर सकते हैं, खासकर अगर वे गतिज हों। लेकिन दुनिया का अधिकांश हिस्सा यथार्थवादी दिखने के लिए सिंक में नहीं होगा।

  2. आपके पास सर्वर पर एक भौतिक विज्ञान की दुनिया हो सकती है और ग्राहकों के लिए वस्तु स्थिति और वेग प्रसारित कर सकती है।


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

मुझे यकीन नहीं है कि मैं आपको वास्तव में पालन कर रहा हूं। मुझे पूरा यकीन है कि यह संभव है क्योंकि कई गेम खिलाड़ियों को टोकरा फेंकने की अनुमति देते हैं (उदाहरण के लिए)। ऐसा लगता है कि आपका विकल्प 2 मेरे विकल्प 2 के समान है, लेकिन मैं ऑब्जेक्ट्स को अपने सर्वर पदों पर सफाई करने के लिए बुलेट नहीं प्राप्त कर सकता हूं। शायद यह मेरी जड़ समस्या है?
लुकास

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