मौलिक रूप से, 2 डी बिटमैप कैसे प्रदान किए जाते हैं?


9

मान लें कि हमारे पास 64-बिट शब्द-पता करने योग्य कंप्यूटर है और हम इसे मेमोरी-मैप्ड डिस्प्ले के लिए बाइनरी इमेज बिटमैप (जैसे नीचे वाला) के रूप में संग्रहीत 5x7 वर्ण को आउटपुट करने के लिए प्रोग्राम करना चाहते हैं।

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें

चूँकि हमारे पास 5 x 7 = 35 पिक्सेल प्रति वर्ण है, इसलिए हम एक शब्द में 35 बिट्स का उपयोग करके चरित्र को स्टोर कर सकते हैं। कम से कम महत्वपूर्ण बिट शब्द के बाईं ओर से शुरू होता है और छवि में प्रत्येक पिक्सेल के साथ n th बिट द्वारा दर्शाया जा रहा है जैसा कि ऊपर दिखाया गया है, उपरोक्त संख्या "3" को स्मृति में संग्रहीत किया जाएगा: 0111010001000010011000001010101110, इसके बाद 29 अप्रयुक्त बिट्स 0 पर सेट।

क्या यह है कि वर्णों को पुराने / आधुनिक कंप्यूटरों में कैसे संग्रहीत किया जाता है? या क्या वे प्रति पिक्सेल प्रति एक बाइट / शब्द का उपयोग करते हैं?

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

  1. एक निश्चित रजिस्टर में अपडेट किए जाने के लिए x और y डिस्प्ले को वर्तमान पिक्सेल के लिए समन्वयित करें।
  2. दो चुने हुए आरजीबी मूल्यों को स्टोर करें (इस मामले में हरे रंग के लिए 0,255,0 और काले रंग के लिए 0,0,0) दो अन्य अलग रजिस्टरों में।
  3. दो और रजिस्टरों के रूप में कार्य किया जा रहा है काउंटर 5 और 7 के लिए आरंभिक पंक्ति और छवि के कॉलम का ट्रैक रखने के लिए आरंभीकृत किया गया।
  4. यदि स्तंभ रजिस्टर 0. नहीं है तो टेस्ट करें। यदि यह नहीं है, तो यदि बिटमैप के LSB को 1 पर सेट किया गया है, तो परीक्षण करें, और परिणाम के आधार पर x और y समन्वय रजिस्टर के साथ संबंधित RGB मान रजिस्टर करें, फिर उस परिणाम का MOV करें प्रदर्शन आउटपुट रजिस्टर करने के लिए।
  5. पंक्ति काउंटर रजिस्टर को 1 से घटाएं, यह देखने के लिए परीक्षण करें कि क्या यह 0. है। यदि यह है, तो इसे वापस 5 पर सेट करें और 1 से y समन्वय बढ़ाएँ और स्तंभ काउंटर को 1 से घटाएं।
  6. बिटमैप को बाईं ओर 1 बिट पकड़े हुए रजिस्टर को शिफ्ट करें।
  7. जेएमपी को निर्देश 4।

क्या ऐसा करने का एक सरल या अधिक कुशल तरीका है? ऐसा लगता है जैसे कि एक छोटे से पाठ के चरित्र को प्रस्तुत करने के लिए भी उतना ही सरल है, काफी बड़ी संख्या में संचालन करता है और लगभग 200 सीपीयू चक्र लेगा।

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


3
ग्राफिक्स प्रोग्रामिंग ब्लैक बुक निश्चित रूप से एक क्लासिक लायक पढ़ने है। इसमें बहुत से ओलेस्कूल काले-जादू;)
19

हां, मैं माइकल अब्राश की किताब का दूसरा हिस्सा हूं। यह एक महान पढ़ें है। इस पुस्तक में जो लिखा गया है, उसके लिए बहुत अधिक ट्रिक हैं, लेकिन इसके पीछे का दर्शन महत्वपूर्ण है (यहां तक ​​कि आज भी!)
रोमेन पिकाओस

जवाबों:


7

आपको अपनी मशीन के ग्राफिक्स बोर्ड के टेक्स्ट और ग्राफिकल मोड को अलग करना होगा।

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

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

मूल रूप से, सरल (पैक्ड) विभिन्न आकारों के द्विआधारी बिटमैप का उपयोग किया गया था और संभव प्रारूप अनुवाद के साथ डिवाइस ड्राइवर के लिए अनुरोध के माध्यम से रास्टर मेमोरी को " ब्लिट्ड " किया गया था।

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

प्रदान किए गए आउटपुट को तेज प्रदर्शन के लिए फिर से ब्लैंक करके कैश्ड किया जा सकता है।

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


1

संक्षिप्त उत्तर हां है, यदि आपके प्रारूप को इसकी आवश्यकता है, तो आप बहुत अधिक हेरफेर करने से बच नहीं सकते।

बिटमैप को आरेखित करने का अर्थ है कि एक स्रोत से एक गंतव्य तक एक पिक्सेल कॉपी करें और आपको वह करना है जो इसे करने के लिए लेता है। (कैप्टन जाहिर करते हुए)

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

तो हाँ वैसे भी, पुराने दिनों में सिंगल पिक्सेल लिखने के लिए बहुत सारे सीपीयू चक्र थे, जब अजीब इनकोडिंग और छोटी मेमोरी आदर्श थी। :-) लेकिन इसने ऐसा करने के लिए 8 MHZ CPU के साथ 16/32 बिट मशीनों को मना नहीं किया: https://www.youtube.com/watch?v=GWwPJU6pp30 (और CPU का एक बड़ा हिस्सा भी इस्तेमाल किया गया था) संगीत के लिए)

HW प्रतिपादन के मामले में, HW स्रोत प्रारूप से गंतव्य प्रारूप में रूपांतरण का प्रदर्शन करेगा और जब यह SW rasterizer के लिए उपलब्ध ट्रिक्स का अधिक उपयोग नहीं करेगा, तो HW में इसका सामान्य कार्यान्वयन, SW कार्यान्वयन के अधिकांश भाग को हरा देगा।

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