मैं बिना फ्रेम बफर के ग्राफिक्स डेमो कैसे बना सकता हूं?

Aug 18 2020

मैं एक माइक्रोकंट्रोलर का प्रोग्रामिंग कर रहा हूं - एक छोटा सा 8 बिट कंप्यूटर जिसमें लगभग 100Mhz - 300Mhz सीपीयू क्लॉक स्पीड और 64K एप्लीकेशन रैम (वास्तव में ROM) है, लेकिन केवल एक छोटी मात्रा में रैम (6K) - एक ग्राफिक्स फ्रेम बफर के लिए पर्याप्त रूप से कहीं नहीं है।

इसलिए, मैं इस मशीन पर एक एनिमेटेड ग्राफिक्स डेमो प्रदर्शित करना चाहता हूं। ऐसा लगता है कि किसी प्रकार के एनिमेटेड ग्राफिक्स की गणना करने के लिए पर्याप्त कंप्यूटिंग शक्ति है।

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

बस स्पष्ट होने के लिए, मैं उस कार्यक्रम के बारे में नहीं पूछ रहा हूं जो प्रदर्शन को नियंत्रित करता है। मैं डेमो प्रोग्राम के बारे में पूछ रहा हूँ। मुझे एक डेमो प्रोग्राम की आवश्यकता है जो एक समय में अपने ग्राफिक्स को एक पंक्ति में देता है, जिसे मेरा डिस्प्ले कंट्रोलर फिर स्क्रीन पर फेंक देगा।

मैं कल्पना करने की कोशिश कर रहा हूं कि किस तरह के ग्राफिक्स प्रोग्राम इस तरह से काम कर सकते हैं? संभवतः गणितीय सूत्र के कुछ प्रकार के प्रदर्शन।

क्या कोई ग्राफिक्स प्रोग्रामिंग के लिए तकनीकों का सुझाव दे सकता है जो इस तरह से काम करता है, जिसमें एक फ़ंक्शन कहा जा सकता है, जो फ्रेम की एक पंक्ति की गणना और रिटर्न करता है, केवल तभी ऐसा करने का अनुरोध किया जाता है? क्या ऐसे मौजूदा कार्यक्रम हैं जो इस तरह काम करते हैं कि मैं जांच कर सकता हूं?

मुझे उम्मीद है कि सवाल समझ में आता है। सही दिशा या संकेत में किसी भी संकेत की सराहना की जाएगी।

जवाब

4 NicolBolas Aug 18 2020 at 22:55

यह एक ऐसा मामला है जहां अधिक रेट्रो हार्डवेयर के कामकाज को देखना उचित होगा। पुराने हार्डवेयर की मेमोरी और प्रोसेसिंग पावर दोनों में मजबूत सीमाएँ थीं। आपकी 100 + मेगाहर्ट्ज चिप 80 के दशक के पहले और पहले के अधिकांश उपभोक्ता-श्रेणी के चिप्स से कहीं अधिक तेज है। इसलिए जब उन CPU को रेंडर करने में सक्षम होने के लिए समर्पित ग्राफिक्स चिप्स की आवश्यकता होती है, तो आपका बहुत तेज़ CPU संभवतः कार्य को पर्याप्त रूप से संभाल सकता है।

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

व्यापक विचार यह है। एक टाइलमैप में दो भाग होते हैं: टाइलों की एक श्रृंखला और टाइल के नक्शे में सूचक का एक 2D सरणी जो बनाई जा रही छवि का प्रतिनिधित्व करता है। टाइल्स आमतौर पर 8x8 हैं, और एनईएस पर 2-बिट्स-प्रति-पिक्सेल थे और टाइलें पैलेट का उपयोग करती थीं। या अधिक विशेष रूप से, टाइल के नक्शे में सूचकांक में न केवल एक टाइल का सूचकांक शामिल है, बल्कि उस टाइल के साथ उपयोग करने के लिए पैलेट का सूचकांक भी शामिल है। तो एक टाइल पैलेट के साथ स्वाभाविक रूप से जुड़ा नहीं है; एसोसिएशन उपयोग के बिंदु पर बनाया गया है (तकनीकी रूप से, एनईएस पर, टाइल का नक्शा और पैलेट मैप अलग-अलग थे, क्योंकि टाइलों के प्रत्येक 2x2 ब्लॉक में सभी को एक ही पैलेट का उपयोग करना था)।

स्क्रॉल करने की अनुमति देने के लिए, टाइल का नक्शा दृश्य स्क्रीन की तुलना में बड़ा है, और एक ऑफसेट है जो प्रतिनिधित्व करता है कि दृश्य स्क्रीन के ऊपरी-बाएँ कोने tilemap के भीतर है। इस ऑफसेट की स्थिति में हो Xoffऔर Yoff

आप देख सकते हैं कि यह पंक्ति-दर-पंक्ति प्रसंस्करण को कैसे तुच्छ बनाता है। क्षैतिज स्थिति Ypos(स्क्रीन-स्पेस में) के लिए एक क्षैतिज पंक्ति उत्पन्न करने के लिए , आपको तिलमाप के भीतर शुरुआती पिक्सेल प्राप्त करने की आवश्यकता है। इसके लिए XY स्थिति (0, Ypos)को स्क्रीन-स्पेस से टिलमैप स्पेस में बदलने की आवश्यकता है। तो आप वेक्टर (Xoff, Yoff)को जोड़ते हैं, वेक्टर को `` एक्सऑफ़, यॉफ़ + योस) से जोड़ते हैं।

ध्यान दें कि स्क्रीन-स्पेस से टिलैप स्पेस के लिए कोई भी मैपिंग करते समय, कि टिलमैप स्पेस को एक्स और वाई दोनों एक्सिस में लपेटना चाहिए। इसलिए जब भी आप tilemap स्पेस में एक नए पिक्सेल की गणना करते हैं, तो आपको इसे tilemap स्पेस के आकार के चारों ओर लपेटना होता है।

अब, हमें इस tilemap पिक्सेल को दो 2D घटकों में तोड़ने की आवश्यकता है: tilemap के भीतर टाइल सूचकांक जो हमें यह पिक्सेल देता है, और उस टाइल के भीतर का पिक्सेल जिसे हमें इस पिक्सेल के लिए लाने की आवश्यकता होती है। टाइल सूचकांक केवल टाइल आकार द्वारा विभाजित टिलमैप-स्पेस पिक्सेल पूर्णांक है। पिक्सेल समन्वय tilemap अंतरिक्ष पिक्सेल integer- है modded टाइल आकार के आधार पर। 8x8 टाइल के आकार को देखते हुए, आप यह कर रहे हैं:

ivec2 tilemap_pixel = ...; //Compute the tilemap starting pixel as above.
ivec2 tilemap_tile = ivec2(tilemap_pixel.x & ~0x7, tilemap_pixel.y & ~0x7); //Mask off the lower 3 bits.
ivec2 pixel_in_tile = ivec2(tilemap_pixel.x & 0x7, tilemap_pixel.y & 0x7); //Mask off all but the lower 3 bits.

इस प्रकार tilemap_tile, अब हमारे पास उस टाइल का सूचकांक है जो हम वर्तमान में काम कर रहे हैं। और pixel_in_tileहमें वह पिक्सेल प्रदान करता है जिसमें हम काम कर रहे हैं। इसलिए हम उस पिक्सेल को प्राप्त कर सकते हैं, जिसका मूल्य उस पिक्सेल के लिए अंतिम रंग बनाने के लिए पैलेट में मैप किया जा सकता है। या हम इसे सीधे उपयोग कर सकते हैं।

अगले पिक्सेल प्राप्त करने के लिए बहुत तुच्छ है। हम सिर्फ pixel_in_tile.x1 से वृद्धि करते हैं, टाइल के आकार को मापते हैं। यदि वेतन वृद्धि टाइल के आकार से अधिक हो गई है, तो हम भी tilemap_tile.x1 से वृद्धि करते हैं, तिलमाप आकार को मापते हैं। और आप तब तक चलते रहते हैं जब तक आप पिक्सल की पंक्ति नहीं भर लेते।

इस तरह के एक एल्गोरिथ्म के प्रदर्शन अनुकूलन के लिए कई अवसर हैं।

टाइल्स शायद सबसे बड़े डेटा का प्रतिनिधित्व करते हैं। 2 बीपीपी पर भी 8x8 टाइल्स का एक 128 एलिमेंट टाइल सेट 2K है। लेकिन बात यह है कि, उन रोम में संग्रहीत किया जा सकता है , क्योंकि आप शायद खुद को टाइल नहीं बदल रहे हैं। टाइल के नक्शे का आकार (यह रैम में होना चाहिए) वांछित आउटपुट रिज़ॉल्यूशन और टाइल के आकार पर निर्भर करता है। 8x8 टाइल्स के लिए एक टाइल मानचित्र जो 320x240 स्क्रीन को कवर कर सकता है, 1,200 बाइट्स है। बिल्कुल छोटा नहीं है। यदि आपको सुचारू स्क्रॉलिंग के लिए कमरा चाहिए (और इस तरह एक बड़ा टाइल नक्शा), तो आपको अधिक मेमोरी लेने की आवश्यकता होगी।

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