दिलचस्प पोस्ट
अपने देशांतर और अक्षांश मान का उपयोग करके दो स्थानों के बीच दूरी की गणना कैसे करें जावा क्लास के इंटरफेस को क्यों पसंद किया जाना चाहिए? अनपाखे गिट को देखना jQuery। एक गतिशील रूप से डाला iframe में पहले से ही एंड्रॉइड में एसिंक्टस्क बनाम थ्रेड दृश्य स्टूडियो 2012 में सी ++ 11 सुविधाओं जावास्क्रिप्ट में iframe तत्वों का उपयोग करें अमान्य XML वर्णों को सी # में से बचें .NET के लिए कोई सभ्य पाठ diff / मर्ज इंजन? स्ट्रिंग इंटर्निंग क्या है? एक्सटेंशन पृष्ठ DOM के बजाय वेबपेज DOM कैसे पहुंचें? डिफ अल्गोरिदम एंड्रॉइड में पृष्ठभूमि का काम करते समय प्रगति डीआईएलओॉग दिखाने के लिए एसिंक टास्क का उपयोग कैसे करें? मैं इंटजर्स को पूर्णांक के रूप में कैसे पढ़ सकता / सकती हूं? शरीर को स्क्रॉल करने से रोकें, लेकिन ओवरले स्क्रॉलिंग को अनुमति दें

आईओएस ऐप की अधिकतम मेमोरी बजट

मैं एक आईओएस गेम पर काम कर रहा हूं जो कि कम से कम 3 जी के रूप में लक्षित है हम रेटिना डिस्प्ले डिवाइसेस (आईफ़ोन 4, आइपॉड टच 4 जीन) के लिए एचडी परिसंपत्तियों का उपयोग कर रहे हैं।

स्मृति बुद्धिमान, आइपॉड टच 4 जी जनरल हमारे लिए सबसे ज्यादा बाध्य डिवाइस लगता है क्योंकि इसकी समान रैम (आईफोन 4 के 512 की तुलना में आयफोन 4 की 512 की तुलना में 256 है) लेकिन हम उस पर एचडी परिसंपत्तियों का उपयोग कर रहे हैं। 100-110 एमबी रैम लोड करने की कोशिश करते समय क्रैश करता था, लेकिन अब जब हम 70 एमबी के नीचे आते हैं, तो हमने कभी भी दुर्घटना लोड नहीं की है।

बहुत सारे के आसपास खोज करने के बाद, कोई आधिकारिक कड़ी सीमा नहीं होती है, इसलिए हम जानना चाहिए कि स्मृति बजट सुरक्षित रहने के लिए कैसे उपयोग करें? हम कलाकारों को एक बजट देने में सक्षम होना चाहते हैं, जो प्रत्येक मानचित्र के लिए स्मृति चिंताओं के बिना उपयोग कर सकते हैं।

वेब के समाधान से एकत्रित समाधान "आईओएस ऐप की अधिकतम मेमोरी बजट"

मुझे लगता है कि आपने अपने प्रश्न का उत्तर दिया है: 70 एमबी की सीमा से आगे नहीं जाने की कोशिश करें, हालांकि यह वास्तव में कई चीजों पर निर्भर करता है: आईओएस संस्करण जिसका उपयोग आप कर रहे हैं (एसडीके नहीं), पृष्ठभूमि में चलने वाले कितने एप्लिकेशन, सटीक स्मृति आप आदि का उपयोग कर रहे हैं

बस तत्काल स्मृति बौछार से बचें (जैसे आप 40 एमबी रैम का उपयोग कर रहे हैं, और फिर कुछ छोटी कम्प्यूटेशन के लिए 80 एमबी की अधिक आवंटित)। इस मामले में आईओएस आपके आवेदन को तुरंत मार देगा।

आपको आलसी लोड होने पर भी विचार करना चाहिए (उन्हें केवल तब ही लोड करें जब आपको वास्तव में आवश्यकता है और पहले से नहीं)।

उपयोगिता स्प्लिट के साथ परीक्षण के परिणाम (लिंक उनके उत्तर में है):

डिवाइस: (दुर्घटना राशि / कुल राशि / कुल का प्रतिशत)

  • iPad1: 127MB / 256 एमबी / 49%
  • iPad2: 275 एमबी / 512 एमबी / 53%
  • आईपैड 3: 645 एमबी / 1024 एमबी / 62%
  • iPad4: 585 एमबी / 1024MB / 57% (आईओएस 8.1)
  • आईपैड मिनी 1 पीढ़ी: 297 एमबी / 512 एमबी / 58%
  • आईपैड मिनी रेटिना: 696 एमबी / 1024 एमबी / 68% (आईओएस 7.1)
  • आईपैड एयर: 697 एमबी / 1024 एमबी / 68%
  • आईपैड एयर 2: 1383 एमबी / 2048 एमबी / 68% (आईओएस 10.2.1)
  • आईपैड प्रो 9.7 ": 13 9 5 एमबी / 1971 एमबी / 71% (आईओएस 10.0.2 (14 एएएसवाई))
  • iPad प्रो 10.5 ": 3057/4000/76% (आईओएस 11 बीटा 4)
  • iPad प्रो 12.9 "(2017): 3057/3974/77% (आईओएस 11 बीटा 4)
  • आइपॉड टच 4 जी जनरल: 130 एमबी / 256 एमबी / 51% (आईओएस 6.1.1)
  • आईपॉड टच 5 जी जनरल: 286 एमबी / 512 एमबी / 56% (आईओएस 7.0)
  • iPhone4: 325 एमबी / 512 एमबी / 63%
  • iPhone4s: 286 एमबी / 512 एमबी / 56%
  • iPhone5: 645 एमबी / 1024MB / 62%
  • iPhone5s: 646MB / 1024MB / 63%
  • iPhone6: 645 एमबी / 1024MB / 62% (आईओएस 8.x)
  • iPhone6 ​​+: 645MB / 1024MB / 62% (आईओएस 8.x)
  • iPhone6s: 1396 एमबी / 2048MB / 68% (आईओएस 9.2)
  • iPhone6s +: 1392 एमबी / 2048MB / 68% (आईओएस 10.2.1)
  • आईफोनईएसई: 13 9 5 एमबी / 2048 एमबी / 69% (आईओएस 9.3)
  • iPhone7: 13 9 5/2048 एमबी / 68% (आईओएस 10.2)
  • iPhone7 +: 2040 एमबी / 3072 एमबी / 66% (आईओएस 10.2.1)

मैंने छोटी उपयोगिता बनाई है जो दुर्घटना के लिए यथासंभव अधिक मेमोरी आवंटित करने का प्रयास करती है और जब मेमोरी चेतावनी और दुर्घटना होती है तो यह रिकॉर्ड करता है। यह जानने के लिए कि किसी भी आईओएस डिवाइस के लिए मेमोरी बजट क्या है।

https://github.com/Split82/iOSMemoryBudgetTest

मेरे एप में, उपयोगकर्ता का अनुभव अधिक बेहतर होता है यदि अधिक मेमोरी का उपयोग किया जाता है, तो मुझे यह तय करना होगा कि क्या मुझे वास्तव में सभी मेमोरी को मुक्त करना चाहिए didReceiveMemoryWarning स्प्लिट और जास्पर पोल के उत्तर के आधार पर, कुल डिवाइस मेमोरी के अधिकतम 45% का उपयोग करना सुरक्षित थ्रेशोल्ड (धन्यवाद दोस्तों) लगता है।

अगर कोई मेरे वास्तविक कार्यान्वयन को देखना चाहता है:

 #import "mach/mach.h" - (void)didReceiveMemoryWarning { // Remember to call super [super didReceiveMemoryWarning]; // If we are using more than 45% of the memory, free even important resources, // because the app might be killed by the OS if we don't if ([self __getMemoryUsedPer1] > 0.45) { // Free important resources here } // Free regular unimportant resources always here } - (float)__getMemoryUsedPer1 { struct mach_task_basic_info info; mach_msg_type_number_t size = sizeof(info); kern_return_t kerr = task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&info, &size); if (kerr == KERN_SUCCESS) { float used_bytes = info.resident_size; float total_bytes = [NSProcessInfo processInfo].physicalMemory; //NSLog(@"Used: %f MB out of %f MB (%f%%)", used_bytes / 1024.0f / 1024.0f, total_bytes / 1024.0f / 1024.0f, used_bytes * 100.0f / total_bytes); return used_bytes / total_bytes; } return 1; } 

स्विफ्ट ( इस उत्तर के आधार पर):

 func __getMemoryUsedPer1() -> Float { let MACH_TASK_BASIC_INFO_COUNT = (sizeof(mach_task_basic_info_data_t) / sizeof(natural_t)) let name = mach_task_self_ let flavor = task_flavor_t(MACH_TASK_BASIC_INFO) var size = mach_msg_type_number_t(MACH_TASK_BASIC_INFO_COUNT) var infoPointer = UnsafeMutablePointer<mach_task_basic_info>.alloc(1) let kerr = task_info(name, flavor, UnsafeMutablePointer(infoPointer), &size) let info = infoPointer.move() infoPointer.dealloc(1) if kerr == KERN_SUCCESS { var used_bytes: Float = Float(info.resident_size) var total_bytes: Float = Float(NSProcessInfo.processInfo().physicalMemory) println("Used: \(used_bytes / 1024.0 / 1024.0) MB out of \(total_bytes / 1024.0 / 1024.0) MB (\(used_bytes * 100.0 / total_bytes)%%)") return used_bytes / total_bytes } return 1 } 

आपको WWDC 2010 सत्र वीडियो से सत्र 147 को देखना चाहिए। यह "आईफोन ओएस पर उन्नत प्रदर्शन अनुकूलन, भाग 2" है
स्मृति अनुकूलन पर बहुत अच्छी सलाह है

कुछ सुझाव हैं:

  • नेस्टेड NSAutoReleasePool उपयोग करके यह सुनिश्चित कर लें कि आपकी मेमरी उपयोग स्पाइक नहीं है।
  • बड़ी छवियों से थंबनेल बनाते समय CGImageSource उपयोग करें
  • कम स्मृति चेतावनियों का जवाब दें

फॉर्लेट SPLITS रेपो द्वारा, मैंने एक आईओएस मेमोरी का परीक्षण करने के लिए एक बनाया जो आज का विस्तार करने के लिए आवंटित किया जा सकता है

iOSMemoryBudgetTestForExtension

इसके परिणामस्वरूप मुझे आईफोन 5 एस में मिला

10 एमबी में मेमोरी चेतावनी

ऐप 12 एमबी में दुर्घटनाग्रस्त हो गया

इसका अर्थ यह है कि ऐप्पल केवल किसी भी एक्सटेंशन को अपनी पूर्ण क्षमता के साथ काम करने की अनुमति दे रहा है

 - (float)__getMemoryUsedPer1 { struct mach_task_basic_info info; mach_msg_type_number_t size = MACH_TASK_BASIC_INFO; kern_return_t kerr = task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&info, &size); if (kerr == KERN_SUCCESS) { float used_bytes = info.resident_size; float total_bytes = [NSProcessInfo processInfo].physicalMemory; //NSLog(@"Used: %f MB out of %f MB (%f%%)", used_bytes / 1024.0f / 1024.0f, total_bytes / 1024.0f / 1024.0f, used_bytes * 100.0f / total_bytes); return used_bytes / total_bytes; } return 1; } 

यदि कोई भी MACH_TASK_BASIC_INFO के बजाय TASK_BASIC_INFO_COUNT का उपयोग करेगा, तो आपको मिलेगा

केर == KERN_INVALID_ARGUMENT (4)

मैंने डिवाइस रैम द्वारा जस्पेर्स लिस्ट को सॉर्ट करके एक और सूची बनाई (मैंने स्प्लिट के उपकरण के साथ अपना खुद का परीक्षण किया और कुछ परिणाम तय किए – इस थ्रेड में मेरी टिप्पणियों की जांच करें)।

डिवाइस रैम: क्रैश करने के लिए प्रतिशत रेंज

  • 256 एमबी: 49% – 51%
  • 512 एमबी: 53% – 63%
  • 1024MB: 57% – 68%
  • 2048 एमबी: 68% – 69%
  • 3072 एमबी: 66%
  • 4096 एमबी: 77%

डिवाइस रैम को आसानी से पढ़ा जा सकता है:

 [NSProcessInfo processInfo].physicalMemory 

मेरे अनुभव से 1 जीबी उपकरणों के लिए 45%, 2/3 जीबी उपकरणों के लिए 50% और 4 जीबी उपकरणों के लिए 55% का उपयोग करना सुरक्षित है। मैकोज़ के लिए प्रतिशत थोड़ा बड़ा हो सकता है