2011-11-07 11 views
9

में रैम उपलब्धता का जवाब देना मेरे पास एक बनावट-भारी ओपनजीएल गेम है जिसे मैं डिवाइस पर कितनी रैम के आधार पर ट्यून करना चाहता हूं। आईफोन 4 या आईपैड 2 पर उच्चतम रिज़ॉल्यूशन बनावट ठीक है, लेकिन पहले डिवाइस बनावट को लोड करने के बीच में दुर्घटनाग्रस्त हो गया है। मेरे पास इन बनावट के कम-रेज संस्करण हैं, लेकिन मुझे यह जानने की ज़रूरत है कि उनका उपयोग कब किया जाए।आईओएस

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

एक और संभावना है कि मैं पहले हाई-रेज बनावट को लोड करना चाहता हूं, फिर उन्हें छोड़ दें और उन्हें कम स्मृति चेतावनी मिलने के बाद उन्हें lo-res के साथ प्रतिस्थापित करें। हालांकि, मुझे यकीन नहीं है कि मुझे प्रतिक्रिया देने का मौका मिलेगा; मैंने देखा है कि डीबग कंसोल पर किसी अधिसूचना से पहले ऐप अक्सर मर जाता है।

मैं कैसे पता लगा सकता हूं कि मेरे द्वारा चलाए जा रहे डिवाइस में मेरे बनावट के हाय-रेज संस्करणों को लोड करने के लिए अपर्याप्त रैम है या नहीं?

एक कदम पीछे लेना, क्या कोई अन्य अनुकूली तकनीक है जिसका उपयोग मैं ओपनजीएल बनावट मेमोरी के लिए विशिष्ट कर सकता हूं?

नोट्स:

  1. मैं पर और उपलब्ध रैम का पता लगाने से संबंधित जवाब के लिए एसओ बंद खोज की है, लेकिन वे सभी मूल रूप से स्मृति उपयोग की रूपरेखा और अपशिष्ट को नष्ट (temporaries के जीवनकाल को न्यूनतम करने के लिए सलाह है, और सभी कि बक)। मैंने जितना संभव किया उतना किया है, और पुराने उपकरणों में हाय-रेज बनावट को निचोड़ने का कोई तरीका नहीं है।

  2. पीवीआरटीसी एक विकल्प नहीं है। बनावट में डेटा को खंडित शेडर्स द्वारा उपयोग किया जाता है और इसे लापरवाह प्रारूप में संग्रहीत किया जाना चाहिए।

+0

ध्यान दें कि आप इस थ्रेड [आईओएस पर मुफ्त मेमोरी] (http://stackoverflow.com/questions/5012886) में विस्तृत कुल रैम और फ्री रैम आंकड़े प्राप्त कर सकते हैं। इसके अलावा, मैंने अपने आईफोन 4 पर कोड का परीक्षण किया और यह अच्छी तरह से काम करता है! –

उत्तर

11

डिवाइस की कुल (अधिकतम) भौतिक RAM प्राप्त करने के लिए [NSProcessInfo processInfo].physicalMemory का उपयोग करें।

Documentation देखें।

0

जहाँ तक मुझे 3 सबसे महत्वपूर्ण बातें एक कर सकते हैं पता है है -

  1. लागू - (void)didReceiveMemoryWarning और जवाब आईओएस उपकरण में चेतावनी 1 & 2.
  2. प्रोफाइल कोड भेजता है खोजने की कोशिश लीक & कार्यान्वयन के बेहतर मेम इष्टतम तरीके।
  3. डिवाइस प्रकारों का पता लगाएं & शायद उस जानकारी का उपयोग करें।
  4. अंतरिक्ष बचाने के लिए पीवीआरटीसी जैसे बनावट संपीड़न के कुछ रूपों का उपयोग करें।

मुझे लगता है कि आप उनमें से अधिकतर कर रहे हैं। बात यह है कि कोई भी यह नहीं जानता कि आईओएस उपकरणों में कितना रैम है। ऐप्पल आईओएस उपकरणों के लिए तकनीकी चश्मे प्रकाशित नहीं करता है।

इसके अलावा, यह नहीं माना जा सकता है कि केवल 100 एमबी खपत के बाद आपको एक चेतावनी मिल जाएगी। आईओएस देता है कि चेतावनियां & डिवाइस की वर्तमान स्थिति के आधार पर भिन्न होती हैं जो अन्य ऐप्स & चल रहे हैं कि वे कितने मेम उपभोग कर रहे हैं। तो यह मुश्किल हो जाता है।

मेरा सुझाव कर सकते हैं 2 वर्गों को पढ़ने चाहिए - Best Practices for Working with Texture Data और Tuning Your OpenGL ES Application

2

सबसे महत्वपूर्ण लगता है कि आप स्मृति प्रबंधन के लिए पता करने के लिए इस मामले में उच्च या निम्न रेस संरचनाओं का उपयोग करने के लिए मौसम है की जरूरत है। सबसे आसान तरीका मैं उपयोग अब तक इस

CGFloat scale = [[UIScreen mainScreen] scale]; 
if ((scale > 1.0) || (self.view.frame.size.width > 320)) { 
     highRes = TRUE; 
} 

सभी उपकरणों के लिए यह काम करता है की जाँच करने के लिए है और भविष्य के सबूत, नए डिवाइस के उच्च रिज़ॉल्यूशन का उपयोग करेगा होना चाहिए। तुम भी वहीं पहलू अनुपात की गणना कर सकते हैं (ipad iphone बनाम पर बाद में मदद करता है)

aspect = self.view.frame.size.width/self.view.frame.size.width 

पहले highres लोड न करें यह, मेरी 3 जी पर मेरी स्टार्टअप के सबसे खर्च किया जाता है लोड हो रहा है आपकी ऐप्लिकेशन लोड समय को मारता है (यहां तक ​​कि कम रेज) बनावट, बस शुरुआत में इस अधिकार के लिए परीक्षण करें और हाईरेस सामान को स्पर्श न करें।

पुराने उपकरणों पर कार्यक्रम बड़े बनावट के कारण चेतावनी के बिना मर जाएगा, डीबगर के साथ कुछ करने के लिए कुछ हो सकता है जो वीडियो मेमोरी खपत को फंसाने और खुद को मरने में सक्षम नहीं है।

अधिक अनुकूलन के लिए आपको सबसे कम बनावट आकार की जांच करने के लिए मिपमैप्स को टिनटिंग करने पर विचार करें (केवल अगर आप 3 डी ऑब्जेक्ट्स का उपयोग करते हैं)।

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

मेमोरी प्रबंधन के बारे में, इसे करने के कई तरीके हैं, सबसे सरल रूप से लोड किए गए बनावट को चिह्नित करना चाहिए, और जब आवश्यक स्मृति बनावट हो, तो लोड होने वाले बनावट को डंप करें लेकिन आवश्यक नहीं है .. ।

+0

विस्तृत प्रतिक्रिया के लिए धन्यवाद। मैं इसे स्वीकार नहीं कर सकता, क्योंकि यह फीचर पहचान का उपयोग करने के बजाय रैम का पता लगाने के मूल प्रश्न का उत्तर नहीं देता है (या क्या आप यह कह रहे हैं कि यह असंभव है या पीछा करने योग्य नहीं है?), लेकिन 'स्केल' को इंगित करने के लिए +1 आईफोन 4 का पता लगाने के लिए 1.0'। मैंने इसके बारे में सोचा नहीं था। –

+0

जेलब्रेकिंग के बिना स्मृति का प्रयास करने और पहचानने का एकमात्र तरीका यह है कि आप इसे भरने की कोशिश कर रहे हैं और यह मापने के लिए कि आपको कितना मिला है। साथ ही स्मृति को अन्य सभी ऐप्स के साथ साझा किया जाता है, जो चल रहा हो सकता है (sytems वाले, मेल की तरह, इत्यादि) यहां तक ​​कि भौतिक स्मृति की मात्रा को जानना भी अधिक मूल्यवान नहीं है। यही कारण है कि मैंने उस मार्ग को भूलना कहा, यह वह ठोस जमीन नहीं है जिसे आप ढूंढ रहे हैं। – led42

+0

आपका शब्द संदिग्ध था कि मुझे वीडियो मेमोरी को अलग से नहीं सोचना चाहिए, या राम को मापने पर छोड़ देना चाहिए। मुझे अन्य चल रहे ऐप्स की परवाह नहीं है; अनुभवी, 256 एमबी के साथ डिवाइस हमेशा दुर्घटनाग्रस्त हो जाते हैं, जबकि 512 एमबी वाले लोग कभी नहीं करते हैं। इसके अलावा, आपका प्रस्तावित परीक्षण नवीनतम आइपॉड टच - रेटिना और 256 एमबी के साथ विफल रहता है - मॉडल पहचान की नाजुकता के बारे में मेरे डर को रेखांकित करता है। संयोग से, आईपॉड टच समस्या के समाधान के लिए शिकार करने से मुझे एक संभावित उत्तर मिल गया, जिसे मैं अलग से पोस्ट करूंगा। –

7

कुल शारीरिक रैम, के रूप में this blog post में दस्तावेज और एक अच्छा साफ एपीआई here (इसी .m फ़ाइल में totalMemory के कार्यान्वयन देखें) के रूप में लागू sysctl() के माध्यम से उपलब्ध है।

मैं सुविधा और भावी पीढ़ी के लिए ब्लॉग का कोड को उठा लिया गया है:

#include <sys/sysctl.h> 

size_t phys_mem() 
{ 
int mib[] = { CTL_HW, HW_PHYSMEM }; 
size_t mem; 
size_t len = sizeof(mem); 
sysctl(mib, 2, &mem, &len, NULL, 0); 
return mem; 
} 

मैं अगर एप्पल इस तरह से sysctl() का उपयोग करता है एक अनुप्रयोग को स्वीकृति दे देंगे पता नहीं है। यह दस्तावेज है, लेकिन केवल मैक ओएस एक्स

+1

क्या आपने कभी ऐप स्टोर ऐप में इसे अनुमोदित करने में हवाला दी है? – Nate

+2

@Nate: हाँ। [आपकी दुनिया] (http://itunes.apple.com/us/app/your-world/id412566625?mt=8) 384 एमबी से अधिक उपकरणों वाले 96 मेगापिक्सेल पृथ्वी को लोड करता है; अन्यथा, यह 24 मेगापिक्सेल संस्करण पर वापस आ जाता है। संख्या के बारे में कुछ खास नहीं है; यह उन डिवाइसों के बीच केवल आधे रास्ते है जो कर सकते हैं, और जो नहीं कर सकते हैं। –

+2

बस [NSProcessInfo processInfo] का उपयोग करें .physicalMemory – Steve