2016-12-21 15 views
5

मैं एक आईओएस ऐप पर काम कर रहा हूं जो ओपनजीएल ईएस के साथ छवियों को प्रस्तुत करता है। यहाँ बनावट मापदंडों और डेटा की स्थापना के लिए मेरी समारोह के मुख्य कोड का टुकड़ा है:आईओएस डिवाइस पर 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() न केवल ग्राफिक्स मेमोरी में मिप मैप बनावट उत्पन्न करता है, बल्कि मुख्य स्मृति का भी उपभोग करता है। और बनावट हटा दिए जाने के बाद मुख्य स्मृति का यह टुकड़ा पुनर्नवीनीकरण किया जा सकता है। बहुत अजीब, है ना?

मुझे आश्चर्य है कि क्यों। और मेरा मुख्य बिंदु यह है कि, बहुत मेमोरी उपयोग के बिना मिप मैपिंग का उपयोग कैसे करें? किसी भी मदद के लिए धन्यवाद।

उत्तर

2

देवता।

  1. आप GL_TEXTURE_MAX_LEVEL का मूल्य निर्धारित करने की आवश्यकता हो सकती है (डिफ़ॉल्ट 1000 है) और GL_TEXTURE_BASE_LEVEL (डिफ़ॉल्ट 0 है)।
  2. 4K रिज़ॉल्यूशन छवि का मतलब "4K बनावट" नहीं है। मेरे अनुभव के रूप में, यदि छवि की लंबाई 1025 एक्स 1025 है, तो बनावट 2048 एक्स 2048 है। कृपया छवि के आकार की जांच करें।
  3. "सीपीयू मेमोरी" -> "मुख्य स्मृति"; "जीपीयू मेमोरी" -> "ग्राफिक्स मेमोरी", उत्तरार्द्ध शायद उपयुक्त हो।
+0

1. मैं glTexParameteri जोड़ने की कोशिश की (GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3); लेकिन यह स्मृति उपयोग के लिए कोई फर्क नहीं पड़ता है। 2. छवि का संकल्प 6912 * 3456 है, इसलिए 2 आकार की निकटतम शक्ति 8192 * 4096 है, आरजीबीए 8 बनावट 128 एम कच्चे बाइट लेगी। – godspeed1024

+0

@godspeed, [मिपमैप विकी] (https://en.wikipedia.org/wiki/Mipmap) देखें: "आरजीबी छवि के मामले में अलग-अलग विमानों के रूप में संग्रहीत तीन चैनलों के साथ, कुल मिपमैप को फिटिंग के रूप में देखा जा सकता है अच्छी तरह से एक वर्ग क्षेत्र में प्रत्येक पक्ष पर मूल छवि के आयाम के रूप में बड़े पैमाने पर दो बार। यह भी दिखाता है कि मिपमैप्स का उपयोग करने से 33% अधिक स्मृति की आवश्यकता होती है। " –

+0

विकी के रूप में, GL_TEXTURE_MAX_LEVEL का मान Mipmap के आकार पर कोई प्रभाव नहीं पड़ता है। –

1

आप glGenerateMipmap(), उपयोग नहीं करना चाहिए बजाय PVRTexTools या TextureTool और एक PVRTC संपीड़न प्रारूप का उपयोग कर की तरह एक उपकरण का उपयोग, देखें: https://developer.apple.com/library/content/qa/qa1611/_index.html

+0

धन्यवाद। लेकिन ऐसा लगता है कि यह दृष्टिकोण केवल स्थिर सामग्री के लिए काम करता है, उदाहरण के लिए, गेम में 3 डी मॉडल के बनावट।लेकिन मुझे गतिशील रूप से लोड छवियों को प्रस्तुत करना है। – godspeed1024

संबंधित मुद्दे