winapi - Why HBITMAP use so little memory? -


मुझे एक दिलचस्प सवाल मिला:

  1. स्मृति में एक बड़ा (4500x6000) jpeg लोड करें (
  2. डेटा से एचबीआईटीएमएपी बनाने के लिए
  3. CreateDIBitmap () बनाएँ

अब मुझे पता चला कि प्रक्रिया केवल 5 एम मेमोरी का उपयोग करती है। मुझे आश्चर्य है कि जहां एचबीआईटीएमएपी का आंकड़ा है (मैं पेजफ़ाइल को अक्षम करता हूं)


अपडेट:

मैं परीक्षण के लिए इस तरह के कोड लिखता हूं:

  // बिटमैप बिटमैप को अक्रिय करना; बिटमैपिनफ़ो जानकारी; // .... शून्य * डेटा = शून्य; एचडीसी एचडीसी = :: GetDC (NULL); एचबीआईटीएमएपी एचबिटमैप = :: ईडीआईबीसीएशन (एचडीसी, एंड इंफॉर्मेशन, डीआईबी_आरजीबीआरएजीएसीएलओआरएसएंड, डाटा, एनएलएल, 0); :: रिलीजडीसी (शून्य, एचडीसी); If (hBitmap) {:: GetObject (m_hBitmap, sizeof (बिटमैप), और बिटमैप); }  

फिर डेटा 0x2d0000 है (निश्चित रूप से उपयोगकर्ता स्थान में), बिटमैप.बीएमबीट भी 0x2d0000 है। इसलिए मुझे यकीन है कि CreateDIBSection को बिटमैप के लिए यूजर स्पेस मेमोरी का इस्तेमाल किया जाता है।

कैसे एक परीक्षण के लिए इस बारे में एक लूप में एचबीआईटीएमएपी बनाएँ सैद्धांतिक रूप से उपयोग किए गए बाइट्स की संख्या की गिनती (आपके वीडियो कार्ड की बिटडिपथ के आधार पर)।

एचबीआईटीएमएपी के मूल्य कितने बाइट्स विफल हो सकते हैं इससे पहले कि आप आवंटित कर सकते हैं? (या, वैकल्पिक रूप से, जब तक कि आप मेमोरी पर कोई प्रभाव नहीं देखते हैं)।

डीडीबी का प्रबंधन डिवाइस ड्राइवरों द्वारा किया जाता है। इसलिए वे दो स्थानों में से एक में संग्रहीत होते हैं: - कर्नेल मोड पृष्ठांकित पूल या वीडियो कार्ड मेमोरी में ही। दोनों जिनमें से किसी भी प्रक्रिया मेमोरी गणना में दिखाई नहीं देगा थिअरी डिवाइस ड्राइवरों में बिटमैप्स के लिए सिस्टम मेमोरी स्टोरेज आवंटित कर सकते हैं, उन्हें आवश्यक रूप से वीआरएम में ले जाया जा सकता है ... लेकिन कुछ वीडियो कार्ड ड्राइवरों को लगता है कि वीडियो मेमोरी पर्याप्त होनी चाहिए और बस कार्ड पर सभी एचबीआईटीएमएपी को आवंटित करना चाहिए। इसका मतलब है कि आप 2 जीबी चिह्न (यदि वे कर्नल पोजिड पूल में आवंटित हैं, उपलब्ध राम के आधार पर 32bit विंडोज संस्करणों को संभालने के लिए) या 256 एमबी मार्क (या वीडियो कार्ड में बहुत मेमोरी है) पर एचबीआईटीएमएपी के लिए स्थान से बाहर निकलते हैं।

इस चर्चा में डिवाइस निर्भर बिटमैप को कवर किया गया।

डिबिसाइन्स एक विशेष मामला हैं क्योंकि उन्हें कर्नेल मोड से अभिगम स्मृति में आवंटित किया गया है, लेकिन यूज़रस्पेस में उपलब्ध है। जैसे, कोई भी एप्लिकेशन जो बहुत सारे बिटमैप का उपयोग करता है, संभवतः चाहिए जहां तक ​​संभव हो वहां DIBSections का उपयोग करें क्योंकि डीडीबी को स्टोर करने के लिए स्थान की व्यवस्था को भूखा करने के लिए बहुत कम अवसर होना चाहिए। मुझे संदेह है कि अभी तक 2 जीबी मूल्य की डिबसाइक्शंस (32 बिट विंडोज संस्करणों) की एक प्रणाली की व्यापक सीमा है क्योंकि कर्नेल मोड में 'वर्तमान प्रक्रिया' की कोई अवधारणा नहीं है, जहां वीडियो डिवाइस ड्राइवरों को एक्सेस की आवश्यकता होगी।

< / div>

Comments

Popular posts from this blog

c# - TypeConverter in propertygrid only converts from string, not to -

php - multilevel menu with multilevel array -

jQuery UI: Datepicker month format -