2012-02-24 6 views
9

मैं अपने आईओएस गेम का परीक्षण कर रहा था और यह कितना मेमोरी ले रहा था और सोचा के बीच एक विसंगति देखी गई है। आखिरकार मैंने 33% अधिक मेमोरी लेने वाले बनावट में समस्या को कम कर दिया, जैसा कि मैंने सोचा था कि उन्हें लेना चाहिए।आईओएस बनावट 33% अतिरिक्त मेमोरी

उदाहरण के लिए, मुझे लगता है कि 256x256 असंपीड़ित 32-बिट बनावट 256 * 256 * 4 बाइट्स = 256k लेनी चाहिए। हालांकि, मुझे लगता है कि 256x256 बनावट आवंटित करते समय 340k की तरह कुछ ऐप की स्मृति बढ़ जाती है। ऐसा लगता है कि डिवाइस बनावट और उसके सभी मिपमैप्स को स्टोर करने के लिए पर्याप्त मेमोरी आवंटित कर रहा था, लेकिन मैं मिप मानचित्र का उपयोग नहीं कर रहा हूं या किसी भी तरह से अंतरिक्ष मांग रहा हूं।

यह अतिरिक्त मेमोरी खड़ी हो गई, क्योंकि यह केवल कुछ उपकरणों पर ही होगी।

: जब एक आइपॉड टच 4. पर खेल का परीक्षण हालांकि, समस्या एक iPhone 3GS, आइपॉड 3 जी, या iPad 1.

उपकरणों पर ओएस संस्करणों रहे हैं नहीं होती मैं अतिरिक्त स्मृति देखा

आइपॉड 3 जी - आईओएस 3.1.2 (7D11) iPhone 3GS - आईओएस 4.3.5 (8L1) आइपॉड 4 - आईओएस 4.2.1 (8C148) आईपैड - iOS 4.3 (8F190)

संपादित

यहां थोड़ी अधिक जानकारी है। मैं मापने के इस

int PlatformIOS::GetProcessMemUsage() 
{ 
    task_basic_info info; 
    mach_msg_type_number_t size = sizeof(info); 
    kern_return_t kerr = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size); 
    if (kerr == KERN_SUCCESS) 
     return info.resident_size; 

    return 0; 
} 

तरह एप्लिकेशन की स्मृति यह एक ही मूल्य है कि आप रियल मेम के लिए insturments कार्यक्रम में देखेंगे देता है। यह वास्तव में बहुत उपयोगी है।

bool GL3DTextureDataPiece::CreateTextureSurface(X3DInterfaceImpl *theInterface, int theWidth, int theHeight, PixelFormat theFormat, RefCount *thePalette, bool generateMipMap) 
{ 
    glGenTextures(1,&mTexture); 
    theInterface->SetCurTexture(this); 

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,mLinearFilter?GL_LINEAR:GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,mLinearFilter?GL_LINEAR:GL_NEAREST); 

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, theWidth, theHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

    return true; 
} 

यह सब बहुत ही बुनियादी सामान है:

और यहाँ कैसे मैं अपने बनावट का आवंटन है। एकमात्र चीज जिसने मुझे पहली जगह में स्मृति समस्याओं को ढूंढने का नेतृत्व किया, विभिन्न उपकरणों के बीच विसंगति थी। वास्तव में, यह कुल ऐप मेमोरी और संसाधन मेमोरी (मैं छवियों और ध्वनि स्मृति को ट्रैक करता हूं) के बीच विसंगति थी जिसने मुझे इस बग को खोजने के लिए जांच की।

+0

प्रदर्शित नहीं करता है कि कोड को प्रभावित करता है, लेकिन मुझे आश्चर्य है कि रेटिना डिस्प्ले के साथ इसका कोई संबंध नहीं है? – summea

+0

आप ऐप्स मेमोरी को कैसे माप रहे हैं? – Justicle

उत्तर

8

मुझे पहले से ही एक समाधान मिला है, इसलिए मैं अपने स्वयं के प्रश्न का उत्तर देने जा रहा हूं। लेकिन मैंने सोचा कि मैं इसे पोस्ट करूंगा क्योंकि यह जानकारी के एक महत्वपूर्ण टुकड़े के बारे में पता होना प्रतीत होता है।

अन्य लोगों को यह बग मिला है। उदाहरण के लिए, यहाँ देखें:

http://www.cocos2d-iphone.org/forum/topic/29121

अच्छी खबर बग के लिए एक समाधान नहीं है कि है। कामकाज केवल गैर-शक्ति-के-2 (एनपीओटी) बनावट का उपयोग करना है। एनपीओटी बनावट को मैप मैप नहीं किया जा सकता है, इसलिए आईओएस अतिरिक्त मिप मैप मेमोरी आवंटित करने की कोशिश नहीं करता है (कम से कम यह सिद्धांत है कि यह क्यों काम करता है।)

सौभाग्य से, यह मेरे इंजन में करना आसान था, क्योंकि यह पहले से ही है छवियों को कई बनावट में विभाजित करता है यदि आवश्यक हो तो बहुत अधिक मेमोरी का उपयोग किए बिना केवल बिजली के 2 बनावट में फिट होना। इसलिए, मैंने बस अपने कोड को tweaked करने के लिए छवियों को विभाजित करने के लिए छवियों को विभाजित करने के लिए tweaked, और आगे की किसी भी छवि को मजबूर करने के लिए जो दोनों आयामों में 2 की शक्ति होने के लिए एक बनावट में लोड करने के लिए 1 पिक्सेल बड़ा था चौड़ाई में आवश्यक है। तो, उदाहरण के लिए, मैं 256x256 छवि को 257x256 बनावट में डाल दूंगा।

इससे 33% अतिरिक्त मेमोरी वृद्धि समाप्त हो गई।

ध्यान दें कि आईपॉड 3 जी जैसे पुराने डिवाइस एनपीओटी बनावट नहीं कर सकते हैं, इसलिए यह जांचना महत्वपूर्ण है कि यह ठीक करने से पहले यह संभव है या नहीं। इसके लिए आप GL_APPLE_texture_2D_limited_npot एक्सटेंशन से पूछ सकते हैं। साथ ही, बनावट को एनपीओटी होने के लिए मजबूर करने के लिए इस अतिरिक्त पिक्सेल को जोड़ने में अधिकतम बनावट आकार को पार न करने के लिए सावधान रहें।

+0

मैंने जवाब स्वीकार करने की कोशिश की, लेकिन आपको ऐसा करने से 2 दिन पहले इंतजार करना होगा। ऐसा लगता है कि वास्तव में, समझ में आता है। तो शायद किसी के पास एक बेहतर जवाब होगा। –

+0

तब पर्याप्त मेला :) – jrtc27

4

सुनिश्चित करें कि आप स्वचालित रूप से उत्पन्न नहीं कर पा रहे हैं मिपमैप करें: http://www.opengl.org/wiki/Texture#Automatic_mipmap_generation

मिपमैप श्रृंखला 33% अतिरिक्त स्थान, के रूप में मिपमैप श्रृंखला 1/3 अतिरिक्त अनुमान लगाती ले जाएगा - श्रृंखला नीचे देखें जहां टी के आकार है मूल बनावट: = टी + टी/4 + टी/16 + टी/64 आदि ...

संपादित करें:

नोट यह भी विधि पोस्ट करने के लिए मददगार होगा तो आप ऐप के स्मृति मापने के लिए इस्तेमाल , और बनावट बनाने के लिए आपने किस विधि का उपयोग किया था।

यह हो सकता है कि आपके द्वारा उपयोग की जाने वाली विधि हमेशा अतिरिक्त 33% बफर बनाती है, या आप विधि को गलत तरीके से कॉल कर रहे हैं।

+0

यह मजाकिया है, क्योंकि मैं इस सटीक लिंक पर आया था और सोचा था कि किसी भी तरह से मिपमैप्स स्वचालित रूप से बनाए जा रहे थे, लेकिन आपको वास्तव में ऐसा करने के लिए glGenerateMipmap को कॉल करने की आवश्यकता है, और मैं इसे कॉल नहीं कर रहा हूं। –