वीडियोगेम कैसे जानकारी को ऑफ़स्क्रीन स्टोर करता है?


16

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

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


24
पैदल सेना: सुपर मारियो में, यदि आप एक हिट? ब्लॉक करें और फिर स्क्रीन पर जाएं, आप वापस नहीं आ सकते हैं - गेम केवल एक दिशा में स्क्रॉल करता है, और सभी ताना पाइप एकल-दिशा हैं।
ट्रेवर पॉवेल

61
जब आप एक पाठ दस्तावेज़ पढ़ते हैं और आप नीचे स्क्रॉल करते हैं, तो क्या आपका वर्ड प्रोसेसर दस्तावेज़ की शुरुआत को हटा देता है?
फिलिप

31
मॉनिटर एक विंडो को Gameworld में दिखाता है। दुनिया आपकी खिड़की के बाहर मौजूद है- आप इसे नहीं देखते हैं।
फेलिसिर

11
बहुत अधिक विशिष्ट नौसिखिया प्रोग्रामिंग प्रश्न है: "मैं स्क्रीन पर अपनी जानकारी कैसे प्रदर्शित करूं?"। किसी भी प्रोग्रामिंग ट्यूटोरियल के माध्यम से काम करें और जब आप उस प्रश्न पर पहुंचें तो आपके पास पहले से ही आपके प्रश्न का उत्तर होना चाहिए।
पीटर

4
मुझे आश्चर्य है कि आप किस तरह के विकास के वातावरण के साथ काम कर रहे हैं , जो स्क्रीन पर चीजों को रखने से उन्हें स्क्रीन पर आने से अधिक जटिल लगता है :) या यह सिर्फ एक विशुद्ध सैद्धांतिक सवाल है?
16

जवाबों:


59

आमतौर पर आपको अपने खेल वातावरण की तार्किक स्थिति को दृश्य प्रतिनिधित्व से अलग करना चाहिए।

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

आपकी रेंडरिंग सबरूटीन जाँच करती है कि स्तर के कौन से हिस्से वर्तमान में स्क्रीन पर हैं और फिर केवल उन्हीं को खींचता है। जो कुछ भी ऑफ-स्क्रीन खींचा नहीं गया है, लेकिन इसका मतलब यह नहीं है कि यह अपडेट नहीं है।


37

आप इसे पीछे की ओर ले जा रहे हैं।

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

फिर आप उन हिस्सों को लोड करते हैं जो ब्याज के हैं - यानी, ऐसे विखंडू जो खिलाड़ी के आसपास के क्षेत्र में हैं। चंक्स जो बहुत दूर हैं उन्हें डिस्क / स्थायी भंडारण में सहेजा जाता है और मेमोरी से अनलोड किया जाता है।

और फिर, अंतिम चरण के रूप में, आप यह निर्धारित करते हैं कि वास्तव में क्या दिखाई दे रहा है और वर्तमान गेम स्थिति का दृश्य प्रतिनिधित्व बनाएं और इसे स्क्रीन पर प्रस्तुत करें।

बेशक आप हर बार पूरे दृश्य प्रतिनिधित्व का पुनर्निर्माण नहीं करने की कोशिश करेंगे लेकिन इसे कैश करें और इसका उपयोग करें यदि आपके पास पहले से निर्मित हिस्से हैं, लेकिन यह मुख्य सिद्धांत है।


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

मुख्य जिस्ट है: इस बारे में सोचें कि आप डेटा को पहले कहां और कैसे स्टोर करते हैं (संभवतः इसके साथ ही इसका प्रतिनिधित्व कैसे करें)। लगभग हर प्रोग्राम को डेटा स्टोरेज से निपटना पड़ता है। ऐसे बहुत कम मामले हैं जिनमें आप कोई डेटा संग्रहीत नहीं करते हैं।


7
हिस्सा? मैं उन छोटे टुकड़ों के स्तर को बुलाऊंगा
gbjbaanb

3
यह अच्छा है, सिवाय इसके कि "आप इसे छोटे हिस्सों में तोड़ते हैं जिन्हें स्वतंत्र रूप से लोड और बचाया जा सकता है। इन भागों को अक्सर विखंडू के रूप में संदर्भित किया जाता है", जो बहुत बड़ी दुनिया के साथ खेलों के लिए विशिष्ट प्रतीत होता है। कई खेलों को ऐसा करने की जरूरत नहीं है। मुझे आश्चर्य नहीं होगा अगर आप कभी भी बनाए गए हर 2D sidescroller के लिए सभी स्तर के डेटा में स्मृति में फिट हो सकते हैं।
user253751

3
@gbjbaanb 'स्तर' एक दिनांकित शब्द है और 'chunk' अधिक व्यापक और स्पष्ट रूप से प्रतिष्ठित अवधारणा है। सभी विखंडू स्तर नहीं हैं और सभी स्तर विखंडू नहीं हैं।
लीलिएन्थल

3
मुझे लगता है कि इसके बारे में सोचने का एक उपयोगी तरीका यह है कि तकनीकी रूप से एक ही पिक्सेल को प्रदान किए बिना पूरे खेल को खेलना संभव होना चाहिए, अर्थात, खेल की संपूर्णता दृश्य प्रतिनिधित्व से अलग है।
नाथन के

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

6

जैसा कि दूसरों ने कहा है, आप एक नक्शा रखते हैं (उदाहरण के लिए एक सरणी में) और उसके दृश्य भाग को स्क्रीन पर ड्रा करें, और स्क्रीन से वापस न पढ़ें।

लेकिन कुछ पुराने सिस्टम में आप सचमुच डेटा ऑफ़स्क्रीन रखेंगे। एक 320x200 डिस्प्ले के लिए 400x300 पिक्सेल की वीडियो मेमोरी होगी, और आप इसमें व्यूपोर्ट को परिभाषित करेंगे ("X = 10 Y = 30 पर शुरू करें")। तो आप केवल एक रजिस्टर को समायोजित करके स्क्रीन को स्क्रॉल कर सकते हैं। आपको बाइट्स को स्थानांतरित करने के लिए आवश्यक सौ हज़ार चक्रों को खर्च करने की ज़रूरत नहीं होगी, आप बस बदलेंगे जहां वीडियो हार्डवेयर उन्हें पढ़ना शुरू कर देगा।

एनईएस में यह है, एक टाइल-आधारित प्रणाली के साथ संयुक्त: http://wiki.nesdev.com/w/index.php/PPU_scrolling

NES कभी भी मेमोरी में पूर्ण छवि नहीं बनाता है, क्योंकि इसमें पर्याप्त RAM नहीं है। इसके बजाय, एक राम सरणी है जो टाइलों के दो-स्क्रीन-वाइड सेट को परिभाषित करता है। टाइल के प्रति एक बाइट। वीडियो हार्डवेयर टाइल और एक्स / वाई ऑफसेट को देखता है ताकि यह तय किया जा सके कि किसी भी बिंदु पर पिक्सेल को क्या दिखाना चाहिए।


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

2
@Polygnome ठीक है, मैं खेल जहां स्क्रीन का एक बहुत लिखा है था खेल स्थिति। यह आश्चर्यजनक है कि आप VRAM के 4 000 बाइट्स के साथ क्या कर सकते हैं! :)
लूआन

1

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

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

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

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

यहां कुछ अच्छी शुरुआती सामग्रियां दी गई हैं:


0

एक हद तक, यह 3 डी कैसे प्रदान किया जाता है, इसका एक कार्य है। उदाहरण के लिए, OpenGL स्वचालित रूप से -1.0, XY स्क्रीन स्पेस में +1.0 रेंज (Z अधिक जटिल या समान) के बाहर की ज्यामिति को बंद कर देगा। Culled ज्यामिति कभी भी टुकड़े (लगभग पिक्सेल) उत्पन्न नहीं करती है और इस प्रकार प्रस्तुत करने के लिए सिस्टम में भेजे जाने के बावजूद वास्तविक इमेजरी में कभी नहीं बदल जाती है। किसी भी मामले में, रेंडर विंडो के बाहर अंतरिक्ष में लिखना असंभव है (यदि सब कुछ उसी तरह काम कर रहा है जैसा कि होना चाहिए)।

कुछ संदर्भों में, अनुकूलन के रूप में इस व्यवहार पर भरोसा करना पर्याप्त है। हालाँकि, आपको अभी भी अपने सभी गेम डेटा को कम से कम एक रेंडरिंग स्टेज (वर्टेक्स शेड्स) के माध्यम से पास करना होगा, इससे पहले कि वीडियो कार्ड यह जान सके कि क्या दिखाई दे रहा है। Skyrim, जैसे कुछ कहना, यह अव्यवहारिक होगा। न केवल आपको रेंडरिंग पाइपलाइन के माध्यम से दुनिया के हर वर्टेक्स को भेजना होगा, बल्कि आपको हर वर्टेक्स को सिस्टम / वीडियो मेमोरी में लोड करना होगा । यह अक्षम है, यदि संभव हो तो भी।

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

इसका वास्तविक संकेत यह है कि दृश्य केवल खेल का उत्पाद है। वास्तविक डेटा का सीधा कोई लेना-देना नहीं है कि आप ज्यादातर समय क्या देख रहे हैं या नहीं देख रहे हैं, और डेटा को विभिन्न बिंदुओं द्वारा फ़िल्टर किया जाता है ताकि बिंदु से टकराने से पहले बाहरी जानकारी को हटा दिया जा सके जहां एक तस्वीर स्क्रीन पर लिखी गई है। इंजन डिजाइन के आधार पर, वास्तविक गेम लॉजिक से विजुअल्स को काफी कम किया जा सकता है, जहां तक ​​एक ही गेम में 2 डी और 3 डी इंटरफेस होने की संभावना है। कई गेम इंजनों के लिए यह संभव है कि वे बिना किसी आउटपुट के साथ चल सकें; कभी-कभी इसका उपयोग गेम AI का परीक्षण करने के लिए किया जाता है।

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

यह ध्यान रखना महत्वपूर्ण है कि अब यह कैसे काम करता है । पुराने मारियो खेलों की संभावना बहुत अलग तरीकों से प्रोग्राम की गई थी (मैं सटीक तरीकों से बात नहीं कर सकता), उस समय चरम हार्डवेयर सीमाएं दी गई थीं। 3D की अवधारणा तब वापस मौजूद नहीं थी; अभी भी लगभग सभी खेल, यहां तक ​​कि जो पूरी तरह से 2 डी हैं, किसी न किसी रूप में 3 डी प्रतिपादन का उपयोग करते हैं, भले ही वे नहीं जानते कि वे करते हैं। आधुनिक वीडियो हार्डवेयर पहले 3 डी है, और 2 डी रेंडरिंग (कम से कम जब यह हार्डवेयर का ठीक से उपयोग करता है) तो केवल 3 आयाम की उपेक्षा करता है।


एलओडी तकनीक के अलावा, इस उत्तर में एक दृश्यलेख जोड़ना अच्छा होगा - जहां एक दुनिया को स्मृति में रखा जा सकता है और 'सीपीयू culled' जो कि दृश्य के भीतर है।
gbjbaanb

0

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

राज्य के उद्देश्यों के लिए सीधे वीडियो रैम का उपयोग करने वाले गेम्स 80 के दशक में 8-बिट में थे, शायद 16-बिट युग में भी, लेकिन जब तक कि आप उस प्लेटफ़ॉर्म के लिए या कुछ RAMC के लिए विकसित नहीं कर रहे हैं जो KB में इसकी रैम को खत्म कर देता है जीबी की, इसके बारे में भूल जाओ।

उस ने कहा, आप प्रोग्रामिंग से जुड़ी हर चीज के लिए बहुत नए हैं, या सवाल यह नहीं आया होगा। मेरा सुझाव है कि यह कदम से कदम पर चल रहा है, पहले बहुत आसान चीजें प्रोग्रामिंग करें; हो सकता है कि ऐसा कुछ हो, जिसमें केवल पाठ्य सामग्री / आउटपुट (सरल संकेत और वह सब कुछ) हो। सच कहूं तो, जिस समय मैंने ऐसा किया, वह लगभग 30 वर्षों के अतीत का है, इसलिए मेरे पास आपके लिए वास्तव में अच्छे संसाधन नहीं हैं, लेकिन आपका स्थानीय पुस्तकालय आपको प्रोग्रामिंग में वास्तव में अच्छी शुरुआत देने के लिए इंटरनेट से बेहतर हो सकता है

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