पुराने खेलों में डेटा संरचनाएं


10

जब मैं NES के लिए सुपर मारियो ब्रदर्स और SNES के लिए सुपर मारियो वर्ल्ड जैसे पुराने खेलों की प्रोग्रामिंग करते समय उपयोग की जाने वाली डेटा संरचनाओं के बारे में उत्सुक हूं। मेरी समझ यह है कि इस अवधि के खेल विधानसभा में लिखे गए थे। क्या प्रोग्रामर किसी भी डेटा संरचनाओं को परिभाषित / उपयोग करते हैं?

उदाहरण के लिए: जब सिक्कों का एक समूह स्क्रीन पर दिखाई देता है तो उन्हें कैसे संग्रहीत किया जाता है? क्या प्रोग्रामर सिर्फ सरण का उपयोग करते हैं? या शायद उनके पास लिंक-लिस्ट थी?

चीयर्स!

संपादित करें : मुझे विभिन्न दृष्टिकोणों में दिलचस्पी है ... जरूरी नहीं कि एक सार्वभौमिक दृष्टिकोण हो।

संपादित करें 2 : मेरे कुछ खेलों में मैं संग्रह के लिए एक (संभावित रूप से खराब) दृष्टिकोण का उपयोग करता हूं और मैं जानना चाहता हूं कि क्या पुराने खेलों में से कोई भी समान दृष्टिकोण का उपयोग करता है। मुझे निम्न कार्य करना पसंद है:

// statically allocated arrays (max number of coins is 4)
int coinsXs[4] = {0, 0, 0, 0};
int coinsYs[4] = {0, 0, 0, 0};

// bitset that keeps track of which coins are active
int coinsActive = 0;

// ...

// update the active coins in an update function
for(int i = 0; i < 4; i++){
    if(coinsActive & (1 << i)){
        // update ith coin
    }
 }

2
कोई सार्वभौमिक उत्तर नहीं है; यह नीचे आता है कि किसी दिए गए प्रोग्रामर ने किसी समस्या के समाधान को कैसे लागू किया।
एड एस।

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

अच्छी बात। मैं वास्तव में गतिशील रूप से आवंटित संग्रहों बनाम सांख्यिकीय रूप से आवंटित संग्रहों के बारे में उत्सुक हूं
MrDatabase

1
क्या विशिष्ट समस्या है आप है? आप क्यों ध्यान रखते हैं कि पुराने खेल क्या करते हैं?
टेट्राद

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

जवाबों:


13

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

अंतर यह है कि एसटीएल से पहले, और प्रदर्शन के साथ इतना महत्वपूर्ण, हमें आमतौर पर संरचनाओं और एल्गोरिदम को खुद लिखना था!

डेविड ब्रेबेन ने 2011 के जीडीसी में एक मजेदार व्याख्यान किया, जहां उन्होंने 1984 में बीबीसी माइक्रो पर एलीट फिट करने के लिए इस्तेमाल किए जाने वाले सभी पागल चालों के बारे में बात की । आप इसे जीडीसी वॉल्ट में मुफ्त में देख सकते हैं


ठंडा। क्या आपने गतिशील रूप से आवंटित सरणियों का उपयोग किया था? या सबसे अधिक एक स्थिर आकार था? मैं उन स्थितियों के बारे में उत्सुक हूं जहां, कहते हैं, पांच सिक्के ऑन-स्क्रीन दिखाई देंगे और ऑन-स्क्रीन बने रहेंगे जब तक कि खिलाड़ी उन्हें एकत्र नहीं करता (या उन्होंने ऑफ-स्क्रीन स्क्रॉल किया)।
MrDatabase

2
@MrDatabase - जहाँ भी संभव हो, स्थैतिक आवंटन। आप तरह के मामलों का वर्णन के लिए, हम अक्सर बस के एक स्थिर आवंटित सरणी होगा जैसे 32 संभव सिक्के कि मौजूद हो सकता है। जब सिक्के दुनिया में आए, तो हम सरणी में एक जगह भरेंगे। जब वे चले गए, हम इसे खाली कर देंगे। डायनामिक आवंटन अनुपलब्ध नहीं था, हमने इसे केवल इसलिए उपयोग करने से परहेज किया क्योंकि जब आप केवल 2MB RAM प्राप्त करते हैं तो आपको वास्तव में अपने प्रोग्राम को निरंतर मेमोरी में चलाने की गारंटी देने की आवश्यकता होती है!
क्रैशवर्क

ठंडा। मैं भी कुछ ऐसा ही करता हूं (देखें # 2 प्रश्न पर संपादित करें)। अपने अपडेट फ़ंक्शन में मैं if(coinsActive)maxNumCoins और अपडेट से पहले लूप से पहले "coinActive" बिटसेट की जांच करता हूं । इस तरह मैं पूरी तरह से लूप से बचता हूं यदि शून्य सिक्के सक्रिय हैं।
MrDatabase

GDC वॉल्ट लिंक की वजह से +1। पीटर मोलेंक्मे द्वारा पोस्टमॉर्टम पॉपॉलस बात सबसे उल्लसित बात होनी चाहिए जिसे मैंने कभी देखा है।
ट्रैविसग

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

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