2012-02-10 15 views
6

मैं पहले से लोड करने छवियों मतवाला कि जब मैं अपने currentView करने के लिए अपने UIImageView जोड़ने के लिए, पीएनजी स्मृति में पहले से ही कर रहे हैं चाहते हैं पहले से लोड करने, लोड, आदिiOS पर छवियों का लोड मजबूर

फुलाया आप इस से देख सकते हैं समय प्रोफाइलिंग, छवियों को प्रदर्शित होने पर लोड किया जाता है: enter image description here

उसी समय, मैं पहले से ही इन छवियों को पहले से लोड कर रहा हूं। बस जब मैं उस दृश्य को लोड, मैं अच्छी तरह से है कि कोड का उपयोग कर इन ऐनिमेशन के लिए सभी छवियों और छवि दृश्य बना:

- (UIImageView*)createAnimationForReel:(NSString*)reel ofType:(NSString*)type usingFrames:(NSInteger)frames{ 
    UIImageView *imageView = [[UIImageView alloc] init]; 
    NSMutableArray *imageArray = [NSMutableArray arrayWithCapacity:frames]; 

    for (int i=0;i<frames;i++){ 
     NSString *image; 
     if(i<10){ 
      image = [NSString stringWithFormat:@"%@_0%i", reel, i]; 
     } else { 
      image = [NSString stringWithFormat:@"%@_%i", reel, i]; 
     } 
     NSString *path = [[NSBundle mainBundle] pathForResource:image ofType:@"png" inDirectory:type]; 
     UIImage *anImage = [[UIImage alloc] initWithContentsOfFile:path]; 
     [imageArray addObject:anImage]; 
    } 
    imageView.animationImages = [NSArray arrayWithArray:imageArray]; 
    imageView.animationDuration = 2.0; 
    return imageView; 
} 

और जब मैं दस्तावेज़ पढ़ें यह कहते हैं: "इस विधि स्मृति में छवि डेटा लोड करता है और यह निशान शुद्ध करने योग्य के रूप में। यदि डेटा को शुद्ध किया गया है और उसे पुनः लोड करने की आवश्यकता है, तो छवि ऑब्जेक्ट उस डेटा को निर्दिष्ट पथ से फिर से लोड करता है। " initWithContentOfFile के बारे में बात कर रहे हैं। तो मेरी छवि "लोड" होना चाहिए।

लेकिन नहीं।

निश्चित रूप से मेरे प्रतिबिंब में कुछ याद आ रही है। पर क्या?

उत्तर

0

रास्ता ImageIO ढांचे (आईओएस 4.0+) का उपयोग करें और इस तरह कुछ करने के लिए होगा:

NSDictionary* dict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:(id)kCGImageSourceShouldCache]; 

CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL); 
CGImageRef cgImage = CGImageSourceCreateImageAtIndex(source, 0, (CFDictionaryRef)dict); 

UIImage* retImage = [UIImage imageWithCGImage:cgImage]; 
CGImageRelease(cgImage); 
CFRelease(source); 
+0

भयानक लग रहा है, और वास्तव में छवियों को लोड करता है, सिवाय इसके कि वे कैश नहीं किए जाते हैं, और जब भी प्रदर्शित होते हैं तब भी पुनः लोड हो जाते हैं। कितनी शर्म की बात है! मुझे लगता है कि UIImageView काम करता है, यूआईएममेज के साथ ऐसा करने के लिए और अधिक कुछ करना है। –

12

एक UIImage से भरा प्रीलोड करना बाध्य करने के लिए, आप वास्तव में यह आकर्षित, या तो की आवश्यकता होगी ऐसा लगता है। उदाहरण के लिए:

- (void)preload:(UIImage *)image 
{ 
    CGImageRef ref = image.CGImage; 
    size_t width = CGImageGetWidth(ref); 
    size_t height = CGImageGetHeight(ref); 
    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, width * 4, space, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst); 
    CGColorSpaceRelease(space); 
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), ref); 
    CGContextRelease(context); 
} 

सुंदर नहीं है, लेकिन यह छवि को 4x तेज के बारे में चित्रित करता है। मैंने आईफोन 4 एस पर 1 एमबी 640 × 1136 पीएनजी के साथ इसका परीक्षण किया:

  • प्रीलोड के बिना इसे ड्रॉइंग लगभग 80 एमएस लगता है।
  • छवि शीर्षलेख को प्रीलोड करना लगभग 10 एमएस लेता है, लेकिन बाद में ड्राइंग को तेज़ नहीं करता है।
  • डेटा प्रदाता को लगभग 100 एमएस लगता है, हालांकि डेटा को प्रीलोड करना, लेकिन बाद में ड्राइंग को शायद ही कभी गति देता है।
  • उपरोक्त कोड में चित्रित ड्राइंग द्वारा प्रीलोडिंग, 100 एमएस लेता है लेकिन अगले ड्रॉ केवल 20 एमएस है।

परीक्षण कोड के लिए https://gist.github.com/3923434 देखें।

+0

पृष्ठभूमि थ्रेड पर इसका उपयोग करने से मेरे ऐप के प्रदर्शन में उल्लेखनीय सुधार हुआ, क्योंकि यह मुख्य थ्रेड को डेटा लोड करने के लिए अवरुद्ध नहीं करेगा। धन्यवाद :) – bendahmon

+0

छवियों को चित्रित करने में यह एक शानदार सुधार है - धन्यवाद! मुझे एक अंतर्निहित रूपांतरण के बारे में चेतावनी मिलती है हालांकि "केसीजीआईमेजएल्फा प्राइमल्टीप्लाइड फर्स्ट" –

+0

धन्यवाद जय चेतावनी को इंगित करने के लिए धन्यवाद, इसे अभी तय किया जाना चाहिए। – leo

0

लियो उत्तर ने मुझे लगभग कोई गति लोडिंग बढ़ावा नहीं दिया। प्रभाव केवल तभी देखा जा सकता था जब मैं पहली बार एक छवि को दूसरी बार फिर से लोड करता था। यदि आप बटन क्लिक करके प्रीलोड को कॉल करते हैं, उदाहरण के लिए, प्रारंभिक लोड 200ms है तो पहले प्रीलोड लगभग 40ms बूस्ट देता है। यह ज्यादा नहीं है।

मेरी समस्या को हल करने के लिए मैंने अभी छिपी हुई छवि दृश्यों को बनाया है और उन्हें पदानुक्रम देखने के लिए जोड़ा है, जहां मुझे एक प्रीलोड की आवश्यकता है। उन छवियों का अगला भार ~ 10ms के करीब ले गया।

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