मैं एक आईओएस ऐप पर काम कर रहा हूं जो ओपनजीएल ईएस के साथ छवियों को प्रस्तुत करता है। यहाँ बनावट मापदंडों और डेटा की स्थापना के लिए मेरी समारोह के मुख्य कोड का टुकड़ा है:आईओएस डिवाइस पर glGenerateMipmap() क्यों इतना क्लाइंट मेमोरी लेता है?
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
यह iPhone पर बस ठीक काम करता है, अलियासिंग के साथ जब ज़ूम आउट, लेकिन। इसलिए मैं, मिपमैप का उपयोग करने की कोशिश की निम्नलिखित के रूप में पिछले कोड को संशोधित करके:
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);// for mipmapping
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
glGenerateMipmap(GL_TEXTURE_2D);// This will generate all mip-mapping textures
और यह mipmapping ज़ूम आउट करके दौरान अच्छी तरह से, कोई और अधिक अलियासिंग काम करता है।
हालांकि, मुझे लगता है कि मिपमैपिंग ने बहुत अधिक मेमोरी ली है: ग्राफिक्स मेमोरी नहीं, लेकिन मुख्य मेमोरी (ओपनजीएल शर्तों में, सर्वर-साइड मेमोरी नहीं बल्कि क्लाइंट-साइड मेमोरी)!
मैं पुष्टि की है कि उपकरण की मेमोरी मॉनिटर के साथ:
mipmapping के बिना, मेरी बनावट समारोह की स्थापना शायद ही स्मृति के किसी भी भाग खर्च करता है, भले ही बनावट स्रोत एक 4K संकल्प छवि है। इस तरह का परिणाम स्पष्ट रूप से साबित करता है कि glTexImage2D केवल ओपनजीएल सर्वर, यानी ग्राफिक कार्ड में स्मृति आवंटित करता है, इस प्रकार मेमोरी मॉनीटर द्वारा इसकी निगरानी नहीं की जा सकती है जो ग्राफिक्स मेमोरी उपयोग की परवाह नहीं करता है।
लेकिन glGenerateMipmap() का उपयोग करके मिपमैपिंग के साथ, जब मैं 4K बनावट बनाता हूं तो हीप मेमोरी उपयोग लगभग 100 मीटर तक बढ़ जाता है। और glDeleteTextures() के बाद, यह वापस आ जाता है।
ऐसा लगता है कि glGenerateMipmap() न केवल ग्राफिक्स मेमोरी में मिप मैप बनावट उत्पन्न करता है, बल्कि मुख्य स्मृति का भी उपभोग करता है। और बनावट हटा दिए जाने के बाद मुख्य स्मृति का यह टुकड़ा पुनर्नवीनीकरण किया जा सकता है। बहुत अजीब, है ना?
मुझे आश्चर्य है कि क्यों। और मेरा मुख्य बिंदु यह है कि, बहुत मेमोरी उपयोग के बिना मिप मैपिंग का उपयोग कैसे करें? किसी भी मदद के लिए धन्यवाद।
1. मैं glTexParameteri जोड़ने की कोशिश की (GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3); लेकिन यह स्मृति उपयोग के लिए कोई फर्क नहीं पड़ता है। 2. छवि का संकल्प 6912 * 3456 है, इसलिए 2 आकार की निकटतम शक्ति 8192 * 4096 है, आरजीबीए 8 बनावट 128 एम कच्चे बाइट लेगी। – godspeed1024
@godspeed, [मिपमैप विकी] (https://en.wikipedia.org/wiki/Mipmap) देखें: "आरजीबी छवि के मामले में अलग-अलग विमानों के रूप में संग्रहीत तीन चैनलों के साथ, कुल मिपमैप को फिटिंग के रूप में देखा जा सकता है अच्छी तरह से एक वर्ग क्षेत्र में प्रत्येक पक्ष पर मूल छवि के आयाम के रूप में बड़े पैमाने पर दो बार। यह भी दिखाता है कि मिपमैप्स का उपयोग करने से 33% अधिक स्मृति की आवश्यकता होती है। " –
विकी के रूप में, GL_TEXTURE_MAX_LEVEL का मान Mipmap के आकार पर कोई प्रभाव नहीं पड़ता है। –