बार-बार बदलते गेम के लिए आप रिकॉर्ड / रिप्ले सिस्टम कैसे डिज़ाइन करते हैं?


10

मैं एक मुफ्त MMORPG में काम कर रहा हूं और मुझे एक समस्या है।

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

समस्या यह है: जब हम गेम के संस्करणों के बीच बदलते हैं, तो वीडियो के लिए बैकवर्ड संगतता बनाए रखना मुश्किल है (कमांड जोड़े गए / हटाए गए, फ़ंक्शन में परिवर्तन, आदि)। क्या इस समस्या को संभालने का एक अच्छा तरीका है? विभिन्न खिलाड़ियों का एक समूह होने के बजाय और वीडियो फ़ाइल के प्रत्येक संस्करण के लिए सही एक का चयन करें?

यह जानना उपयोगी होगा कि अन्य खेल इस स्थिति को कैसे संभालते हैं।

मदद के लिए धन्यवाद, मेरी अंग्रेजी के लिए खेद है।


बस googling / शोध के लिए कुछ और भोजन के रूप में: जिस तरह से आप इसे करते हैं वह बिल्कुल उसी तरह है जैसे आईडी के क्वैक गेम्स ने डेमो को रिकॉर्ड किया, सर्वर पैकेजों को कैप्चर करके। जहाँ तक मुझे पता है कि उन्होंने कभी भी संगतता मुद्दों को हल नहीं किया।
माइकल Stum

मैंने इस प्रश्न का शीर्षक बदल दिया है- यह वास्तव में MMOs के बारे में नहीं है, सिवाय इसके कि MMOs सबसे अधिक बार बदलने वाले खेल हैं।

जवाबों:


8

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


इस गेम में ऐसा होता है .. पैकेट जोड़े, हटाए गए, स्थानांतरित किए गए (उदाहरण के लिए, कुछ समय पहले, हमने सभी GM-Commands से संबंधित पैकेटों को एक "विस्तारित पैकेट" पर ले जाने का फैसला किया है, यह तब संभव होगा जब हम फिर से लिखेंगे। गिल्ड्स सिस्टम .. एडिटिंग कमांड्स / फ़ंक्शंस (इसकी कार्यक्षमता को बदलना) कम होने की संभावना है, लेकिन यह बात नहीं है। आप कहते हैं कि अब से, हमें कोई पैकेज नहीं निकालना चाहिए, कमांड्स को हटा दें बस उन्हें अप्राप्य सर्वर साइड दें? आपके उत्तर के लिए!
मार्को

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

1
इसके अलावा, कुछ अतिरिक्त योजना से मदद मिलेगी। बेहतर है कि आप अपने पैकेटों की योजना अभी से बना लें, भविष्य में आपको जितने कम बदलाव करने होंगे।
काइलोटन

समस्या यह है कि खेल हमेशा बदल रहा है। हम लगभग हर महीने एक नया पैकेट जोड़ते हैं (हम नई सुविधाएँ जोड़ते हैं)। और फिर भी, हमें पुराने पैकेटों को फिर से लिखने की विशेषताओं में बहुत सारे बदलाव करने होंगे और इसलिए .. लेकिन मुझे लगता है कि हम वहां के तरीकों को छोड़ सकते हैं और उन्हें हटाने के लिए एक साल का इंतजार कर सकते हैं।
मार्को

3
अधिक सामान्य पैकेट प्रकारों का उपयोग करने से आपको यहां बहुत मदद मिलेगी। आपको लागू होने वाली प्रत्येक नई सुविधा के लिए नए संदेश जोड़ने की आवश्यकता नहीं है।
काइलोटन

5

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


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

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

@ मार्को: मुझे संदेह है कि SC2 कैसे काम करता है, यह एक DLL में लगभग सभी कोड डालता है। जब यह एक रिप्ले को लोड करता है, तो यह संस्करण की जांच करता है, और उस संस्करण के लिए DLL को लोड करता है, और चलाता है। यह काफी अधिक जटिल है, लेकिन उपयोगकर्ता को केवल एक इंस्टॉल करने की आवश्यकता है, और एक exe सभी पुराने रिप्ले को चला सकता है।
मिंग डक

1

इससे निपटने का एक तरीका "गेमर्स ऑफ न्यूएर्थ" नामक खेल की तर्ज पर है। (जो हर +/- 2 सप्ताह में बदल जाता है) मैं उन्हें क्या बता सकता हूं:

  1. खेल और रिप्ले के लिए अलग पैचिंग का उपयोग करें।
  2. सभी रिप्ले क्लाउड पर संग्रहीत हैं। वे अंततः समाप्त हो जाते हैं।
  3. यदि उपयोगकर्ता एक पुराने डाउनलोड किए गए रीप्ले को देखना चाहता है, तो उन्हें पहले "कम्पेटाइज़" बटन का उपयोग करना होगा।
  4. ऐसा लगता है कि या तो रिमोट नवीनतम संस्करण में भिन्न है; या इस घटना में कि रिप्ले अब संग्रहीत नहीं है, इसे अपलोड करता है और फिर दूरस्थ रूप से भिन्न होता है।

क्योंकि मैं S2 में काम नहीं करता, मैं स्पष्ट रूप से यह नहीं कह सकता कि यह कैसे काम करता है। हालांकि, मैंने रिप्ले की उम्र से जुड़े एक चिह्नित डाउनलोड आकार की प्रवृत्ति पर ध्यान दिया है।

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

मैं निश्चित रूप से ग्राहक पर ऐतिहासिक व्यवहार को संग्रहीत नहीं करूंगा क्योंकि यह बहुत तेज़ी से बढ़ सकता है। खासकर जब क्लाइंट उदाहरण के लिए 10.1.0 से 10.2.0 तक अपडेट कर रहा है (जैसा कि उन्हें अंतिम पैच के बजाय दो संस्करणों के बीच प्रत्येक पैच को डाउनलोड करने की आवश्यकता है)।

Google Protobuf एक क्रमांकन परत के रूप में एक अच्छा विचार है क्योंकि यह डिजाइन द्वारा इस तरह से सामान का समर्थन करता है।

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