2011-11-13 10 views
14

मैंने सुना है कि पुराने आर्केड साइड स्क्रॉलिंग गेम ने प्रदर्शन साइड स्क्रॉलिंग को सक्षम करने के लिए एक विशिष्ट प्रोग्रामिंग हैक का उपयोग किया था।पुराने गेम से "साइड स्क्रॉलिंग हैक" क्या है?

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

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

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

हालांकि, साइड स्क्रॉलिंग गेम के लिए, यह बात सरल और स्पष्ट नहीं है। फिर भी, मुझे पता है कि किसी ने, अतीत में कहीं भी, ऑप्टिमाइज़ेशन के बावजूद (कुछ सीमाओं के साथ) पुरानी मशीनों को हर फ्रेम को दोबारा बिना पृष्ठभूमि के क्षैतिज रूप से स्क्रॉल करने की अनुमति दी गई है।

यह IIRC, कई पुराने खेल में इस्तेमाल किया गया था ज्यादातर 80 beat'em अप, साथ ही में demoscene प्रस्तुतियों

आप इस तकनीक का वर्णन और उसके लेखक का नाम बता सकते?

+1

दो उत्कृष्ट गैर-ओवरलैपिंग उत्तर! काश मैं दोनों स्वीकार कर सकता हूं :-) – Kos

उत्तर

10

मैंने अच्छे पुराने सी 64 के लिए बिल्कुल वही काम किया है। और वहाँ मूल रूप से दो चीजों के बारे में पता होना करने के लिए कर रहे हैं:

  1. ये खेल bitmapped ग्राफिक्स का उपयोग कर नहीं थे, लेकिन बजाय प्रयोग किया "पुनः मानचित्रित" चरित्र फोंट, जिसका अर्थ है कि 8x8 पिक्सल का हिस्सा वास्तव में के रूप में सिर्फ एक बाइट के आसपास hurdled गया ।

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

तो 2) वास्तव में 7 पिक्सेल दूर स्क्रॉल करना संभव बना दिया। फिर आप चारों ओर हर चरित्र को स्थानांतरित कर दिया - जो एक पूर्ण स्क्रीन के लिए बिल्कुल 1000 बाइट्स था, जिसे कंप्यूटर का सामना करना पड़ सकता था, जबकि साथ ही आप स्क्रॉलिंग रजिस्टर को 7 पिक्सेल वापस ले जाते थे। 8 - 7 = 1 का मतलब है कि ऐसा लगता है कि आपने अभी तक एक और एकल पिक्सेल स्क्रॉल किया है ... और फिर यह अभी भी जारी है। तो 1) और 2) संयुक्त सच चिकनी स्क्रॉलिंग के भ्रम बना दिया!

उसके बाद एक तीसरी चीज खेल में आई: रास्टर इंटरप्ट्स। इसका मतलब है कि सीपीयू एक बाधा उत्पन्न करता है जब टीवी/मॉनिटर एक निर्दिष्ट स्थान पर एक स्कैन लाइन ड्राइंग शुरू करने वाला था। उस तकनीक ने स्प्लिट स्क्रीन बनाने के लिए संभव बनाया ताकि आपको मेरे पहले विवरण के विपरीत संपूर्ण स्क्रीन स्क्रॉल करने की आवश्यकता नहीं थी।

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

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

+0

अच्छा। मैंने पीसी पर ऐसा कुछ करने की कोशिश की, लेकिन सेट में 256 अलग-अलग "अक्षर" डालने में सक्षम होने से बाधा आई थी। –

+0

एक चरित्र द्वारा क्षैतिज रूप से डिस्प्ले को कम करने के लिए सी 64 की वीडियो चिप में एक झंडा भी था, इसलिए आप वर्तमान में स्क्रॉल किए गए अतिरिक्त वर्ण को नहीं देख पाएंगे। –

+0

@yi_H काफी। अब आप वास्तव में विवरण में हैं! :-) –

8

मैंने दो अलग-अलग दृष्टिकोणों का उपयोग करके 90 के दशक में कुछ ऐसा ही किया।

पहला "विंडोिंग" शामिल था, जिसे वीईएसए एसवीजीए मानक द्वारा समर्थित किया गया था। कुछ कार्ड इसे सही ढंग से लागू किया गया। असल में, यदि आपके पास प्रदर्शित करने योग्य क्षेत्र की तुलना में एक फ्रेम बफर/वीडियो रैम बड़ा था, तो आप एक बड़े बिटमैप को आकर्षित कर सकते हैं और उस क्षेत्र के भीतर सिस्टम को एक विंडो के लिए निर्देशांक दे सकते हैं जिसे आप प्रदर्शित करना चाहते थे। उन निर्देशांक को बदलकर, आप फ्रेम बफर को फिर से भरने के बिना चारों ओर स्क्रॉल कर सकते हैं।

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

Procedure flip; assembler; 
    { This copies the entire screen at "source" to destination } 
    asm 
     push ds 
     mov  ax, [Dest] 
     mov  es, ax 
     mov  ax, [Source] 
     mov  ds, ax 
     xor  si, si 
     xor  di, di 
     mov  cx, 32000 
     rep  movsw 
     pop  ds 
    end; 

:

मैं इस वर्ष 286 कोडांतरक कोड (! एक कार्य कर 17 साल पुराने फ्लॉपी पर) है कि वीडियो बफर करने के लिए एक ऑफ स्क्रीन पृष्ठ से एक 64000 बाइट (320x200) स्क्रीन की नकल की पाया rep movsw सीएक्स शब्द ले जाया गया (जहां इस मामले में एक शब्द दो बाइट्स है)। यह बहुत ही कुशल था क्योंकि यह मूल रूप से एक ही निर्देश है जो सीपीयू को पूरी चीज जितनी जल्दी हो सके स्थानांतरित करने के लिए कहता है।

हालांकि, यदि आपके पास एक बड़ा बफर था (कहें, एक साइड स्क्रोलर के लिए 1024 * 200), तो आप आसानी से नेस्टेड लूप का उपयोग कर सकते हैं, और प्रति लूप पिक्सल की एक पंक्ति की प्रतिलिपि बना सकते हैं। 1024-पिक्सेल चौड़ा बफर में, उदाहरण के लिए, आप बाइट्स नकल कर सकता है:

start   count    
0+left   320 
1024+left  320 
... 
255*1024+left 320 

जहां left है एक्स बड़े पृष्ठभूमि छवि है कि आप (स्क्रीन के बाईं ओर) पर शुरू करना चाहते हैं के भीतर समन्वय।

बेशक, 16-बिट मोड में, सेगमेंट पॉइंटर्स (ईएस, डीएस) के कुछ जादू और हेरफेर को 64 केबी (वास्तविकता में, कई आसन्न 64k बफर) से बड़ा बफर प्राप्त करने की आवश्यकता थी, लेकिन यह बहुत अच्छी तरह से काम करता था।

शायद इस समस्या के बेहतर समाधान थे (और निश्चित रूप से आज उपयोग करने वाले बेहतर लोग), लेकिन यह मेरे लिए काम करता था।

2

आर्केड गेम अक्सर सीपीयू किए बिना (अधिक) काम करने के बिना स्क्रॉलिंग की अनुमति देने के लिए अनुकूलित वीडियो चिप्स या असतत तर्क दिखाते हैं। दृष्टिकोण सी -64 पर डैनबीस्ट्रॉम का वर्णन करने के समान होगा।

मूल रूप से ग्राफिक्स हार्डवेयर ने स्क्रॉलिंग रजिस्टरों की सीमा तक पहुंचने के बाद सभी टाइल्स को प्रतिस्थापित करने के लिए ठीक स्क्रॉलिंग वर्ण (या टाइल्स) और सीपीयू का ख्याल रखा।मैं वर्तमान में आईआरएम एम -52 बोर्ड देख रहा हूं जो हार्डवेयर में एकाधिक स्क्रॉलिंग पृष्ठभूमि से संबंधित है। Schematics ऑनलाइन पाया जा सकता है।

1

कमोडोर अमीगा पर दाएं स्क्रॉलिंग के लिए हमने स्क्रीन को 16 पिक्सल तक दाएं स्थानांतरित करने के लिए कॉपर का उपयोग किया। जब स्क्रीन को स्थानांतरित किया गया था तो हमने स्क्रीन बफर के प्रारंभिक पते पर 2 बाइट जोड़े थे, जबकि दाएं तरफ हमने मुख्य स्मृति से स्क्रीन बफर में ग्राफिक्स की प्रतिलिपि बनाने के लिए ब्लिटर का उपयोग किया था। हम स्क्रीन बफर को स्क्रीन दृश्य से थोड़ा बड़ा सेट करेंगे ताकि हम व्यूपोर्ट के दाईं ओर कॉपी करने से झटकेदार प्रभाव को देखे बिना ग्राफिक्स की प्रतिलिपि बना सकें।