गेम में पैच कैसे काम करते हैं?


37

कंसोल और पीसी गेम्स में कभी-कभी बग को ठीक करने के लिए पैच होते हैं, जिसे डेवलपर्स ने याद किया / जिनके पास ठीक करने का समय नहीं था।

मेरा सवाल है कि ये कैसे काम करते हैं?

कभी-कभी पैच फाइलें कुछ मेगाबाइट आकार में होती हैं। मुझे समझ में नहीं आ रहा है कि कैसे एक छोटी फाइल एक कंप्लीट प्रोग्राम को बदल सकती है।


आप एक छोटे पैच का उपयोग करके बनाए गए संकलित खेलों को बदलना चाहते हैं?
वुल्फडॉन

नहीं, मैं इसके पीछे सिद्धांत में दिलचस्पी रखता हूं। मेरे खेल सिर्फ उन्हें फिर से
जोड़ने

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

3
कुछ मेगाबाइट "छोटा" नहीं है। मान लें कि हमारे पास तीन मेगाबाइट फ़ाइल है, जो संपीड़ित कोड के छह मेगाबाइट है, संपीड़ित। मान लीजिए कि निर्देश औसतन छह बाइट्स हैं, तो यह एक लाख निर्देशों के बारे में है। (आइए, स्ट्रिंग डेटा जैसे स्टैटिक डेटा और व्हाट्सएप पर ध्यान न दें।) यदि C की एक पंक्ति लगभग दस मशीन निर्देशों से मेल खाती है, तो यह कोड की 100,000 लाइनें हैं। यह किसी खेल के मुख्य इंजन के लिए पर्याप्त लगता है। अधिकांश इंस्टॉलेशन आकार बनावट के नक्शे, स्क्रीन, वीडियो अनुक्रम जैसे सामान होंगे।

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

जवाबों:


30

ऐसा करने के कई तरीके हैं, सबसे सरल होगा दो फाइलों को XOR करना और उन्हें (GZIP या इसके बाद) सेक करना। इसके पीछे सिद्धांत यह है कि उम्मीद है कि आप शून्य का एक बड़ा अनुक्रम प्राप्त कर सकते हैं (समान मूल्यों के लंबे अनुक्रम अच्छी तरह से संपीड़ित करते हैं)।

आप उस अवधारणा को आगे ले जा सकते हैं और कोशिश कर सकते हैं और उन दो फाइलों के क्षेत्रों का पता लगा सकते हैं, जहां डेटा समान है और इसे पूरी तरह से छोड़ दें।

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

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


आप व्यक्तिगत रूप से एक exe में प्रत्येक विधि पैकेज द्वारा क्या मतलब है। क्या यह व्यावहारिक है?
वोल्फडाउन

@AththurWulfWhite हाँ। इंडी हाउस के लिए संभवत: उस समय के लायक नहीं है क्योंकि इसमें अत्यधिक समय और प्रयास लगेगा (आपको अनिवार्य रूप से अपना खुद का लिंकर लिखना होगा) - 'पैचिंग टेक्नोलॉजी' से निपटने वाली कंपनी के रूप में यह विशेष रूप से प्रयास के लायक होगा। यह सब इस बात पर निर्भर करता है कि निष्पादन योग्य कोड कितना बड़ा है - मैंने सेक्रेड 2 पर एक त्वरित नज़र डाली और यह 26mb (मुख्य EXE के लिए 8mb) था। एक बाइनरी अंतर भले ही इसके करीब पहुंचने में सक्षम हो सकता है - फिर भी यह एक विचार है जो वहां डाल सकता है (मुझे पता है कि सीएबी को EXE पर अच्छा संपीड़न मिलता है क्योंकि वे संरचना का लाभ उठाते हैं)।
जोनाथन डिकिंसन

वो बहुत रुचिकर है। मुझे लगता है कि बैंडविड्थ के साथ यह आज है, गेम पैच का आकार कम करना एक बड़ा मुद्दा नहीं है। एक दिलचस्प अच्छी तरह से सोचा बाहर जवाब +1।
वोल्फडाउन

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

2
@SeanMiddleditch मैं यह साबित करने जा रहा हूँ कि यह संभव है :)।
जोनाथन डिकिंसन

15

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

एक पैच इन सभी में से किसी एक में समस्याओं को ठीक किए बिना मुद्दों को ठीक कर सकता है।

सभी बदली हुई फाइलों की जगह की तुलना में एक अलग दृष्टिकोण बस एक द्विआधारी करने के लिए हो सकता है diff उन पर, और केवल packackge वास्तविक मतभेद पुनः वितरित किया जाना है।

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


2
आप इसे एक उदाहरण के रूप में उल्लेख कर सकते हैं: daemonology.net/bsdiff
wolfdawn

2
अच्छा व्यावहारिक उत्तर। +1
वोल्फडाउन

2

आम तौर पर वे गेम डेटा को पैच वितरित करने के लिए एक तृतीय-पक्ष बाइनरी डिफ सिस्टम का उपयोग करते हैं। निष्पादनयोग्य आम तौर पर छोटे होते हैं जिन्हें पूरी तरह से पूरी तरह से वितरित किया जाता है।

अधिकांश आधुनिक खेलों में गेम डेटा (अधिकतर बनावट, मॉडल, स्तर डेटा आदि) के सैकड़ों megs हैं। इन्हें बहुत बार पैचिंग की आवश्यकता होती है। जहाँ तक मुझे पता है, प्रकाशकों के पास सामान्य तौर पर ऐसा करने का एक मानक स्वामित्व तरीका होता है।

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


-1

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

एक बार जब आपके पास समान बाइट अनुक्रमों की सूची होती है, तो आपको केवल पुराने और नए ऑफसेट, लंबाई और निश्चित रूप से कुछ भी नया भेजने की आवश्यकता होती है। प्राप्त करने के पक्ष में, यह तब सीधा विधानसभा है। उन बिट्स को कॉपी करें जिन्हें आपको पुरानी फ़ाइल से रखना है, नए बिट्स में भरें।

पैच बनाना और भी आसान हो जाता है यदि आपका लिंकर एक MAP फ़ाइल को थूक सकता है जो फ़ाइल में प्रत्येक फ़ंक्शन के ऑफसेट को सूचीबद्ध करता है।

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