SORU
29 Mayıs 2009, Cuma


Bu Uİİmage imageNamed dağıttılar: FUD

Şubat 2014 Düzenleme:Bu soruyu iOS 2.0 tarihleri unutmayın!Görüntü işleme gereksinimleri ve o zamandan bu yana çok şey değişti. Retina görüntüler daha büyük ve onları biraz daha karmaşık yükleme yapar. İPad desteği ve retina görüntüleri, yerleşikkesinlikle kodunuzda İmageNamed kullanmalısınız.

İnsanlar imageNamed İnsan performansı özellikle UITableViewrender ler ne zaman iyi olduğunu söylemenin kötü ama eşit sayıda olduğunu söyleyen bir sürü görüyorum. Örneğin this SO question iPhoneDeveloperTips.com this article bkz

UIImage'imageNamed yöntem nin en iyi Kaçınılması böylece sızıntı vardı ama düzeltildi son sürümlerde. Anlamak istiyorum önbelleğe alma algoritması daha iyi yapmak için bir gerekçeli karar nerede güvenebileceğim sistemi için önbellek görüntüleri ve yere geçmem lazım ekstra mil ve kendim yaparım. Geçerli benim temel anlayış UIImages dosya adı tarafından başvurulan NSMutableDictionary basit olmasıdır. Daha büyük olur ve hafıza bittiğinde çok küçülüyor.

Örneğin, imageNamed arkasında resim önbelleği didReceiveMemoryWarning yanıt vermeyen kimse kesin bilen var mı? Apple böyle bir şey yapmaz olanaksız gibi.

Eğer önbelleğe alma algoritması herhangi bir bilgi varsa, lütfen burada yazılan.

CEVAP
2 HAZİRAN 2009, Salı


tldr: İmagedNamed iyi. Bellek iyi işler. Kullanmak ve endişelenmeyi bırak.

Kasım 2012 DüzenleyinBu soruyu tarihleri iOS 2.0! dikkat Görüntü işleme gereksinimleri ve o zamandan bu yana çok şey değişti. Retina görüntüler daha büyük ve onları biraz daha karmaşık yükleme yapar. İPad ve retina görüntüler için dahili destek ile, kesinlikle kodunuzda İmageNamed kullanmalısınız. Şimdi, gelecek nesillerin iyiliği için:

sister thread Apple Dev forumda bazı iyi trafik aldı. Özellikle Rincewind bazı yetki ekledi.

İPhone OS 2'de sorunlar vardır.bu imageNamed burada x: cache temizlenmiş olması değil, hatta hafıza uyarısından sonra. Kolaylık sağlamak için önbellek için değil, ama bir sürü aldı, muhtemelen sorun büyütülmüş olan daha fazla olması gerekirdi. aynı zaman imageNamed:

buna rağmen bu uyarı

Hız cephesinde, bir genel biteni yanlış anlaşılma var. En büyük şey bu imageNamed: mu deşifre görüntü veri kaynağı dosyası, hangi hemen hemen her zaman önemli ölçüde şişer veri boyutu (örneğin, bir ekran boyutunda PNG dosya olabilir tüketmek bir kaç düzine KBs sıkıştırılmış, ama tüketir yarım MB sıkıştırılmış genişlik * yükseklik * 4). Kontrast imageWithContentsOfFile tarafından: bu görüntü tabi. her seferinde genişletmek Tahmin edersiniz, eğer istediğiniz resim verileri bir kez kazandın burada hiçbir şey dışında bir önbelleğe alınmış sürümünü resmi asılıydı ve büyük olasılıkla daha uzun süre gerekir. Eğer sık sık yeniden çizmek için gereken büyük bir resim varsa, ancak, o zaman öncelikle tavsiye ederim, büyük bir görüntü:) yeniden çizmekten kaçınmak için olsa da alternatifleri var.

İle ilgili genel davranış önbellek, önbellek dayalı dosya (yani iki örnekleri imageNamed: aynı adla gereken sonuç başvurular için aynı önbelleğe alınan veriler) ve önbelleği büyüyecek dinamik olarak isteği daha fazla resim üzerinden imageNamed:. İPhone OS 2.x bir hata bellek bir uyarı alındığında çekmiş olmaktan önbellek engeller.

ve

Benim anlayış imageNamed: iPhone OS önbellek saygı duymalı hafıza uyarıları 3.0. Fırsat bulunca Test ve eğer bu durum böyle değil bulursanız rapor hataları.

İşte her şey burada var. imageNamed: windows değil şut ya da çocuklarını öldürür. Ama bir optimizasyon aracıdır oldukça basit. Ne yazık ki kötü isimleri ve kullanımının - dolayısıyla insanların aşırı ve sadece işini yapar zaman üzülecek kadar kolay olduğunu equivaluent yok

Uİİmage için bir kategori, bunu tamir etmek için ekledim:

// header omitted
// Before you waste time editing this, please remember that a semi colon at the end of a method definition is valid and a matter of style.
  (UIImage*)imageFromMainBundleFile:(NSString*)aFileName; {
    NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
    return [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", bundlePath,aFileName]];
}

Rincewind de kendi optimize edilmiş sürümü oluşturmak için bazı örnek kod dahil. Bu maintentace değer göremiyorum ama burada bütünlüğü sağlamak için.

CGImageRef originalImage = uiImage.CGImage;
CFDataRef imageData = CGDataProviderCopyData(
     CGImageGetDataProvider(originalImage));
CGDataProviderRef imageDataProvider = CGDataProviderCreateWithCFData(imageData);
CFRelease(imageData);
CGImageRef image = CGImageCreate(
     CGImageGetWidth(originalImage),
     CGImageGetHeight(originalImage),
     CGImageGetBitsPerComponent(originalImage),
     CGImageGetBitsPerPixel(originalImage),
     CGImageGetBytesPerRow(originalImage),
     CGImageGetColorSpace(originalImage),
     CGImageGetBitmapInfo(originalImage),
     imageDataProvider,
     CGImageGetDecode(originalImage),
     CGImageGetShouldInterpolate(originalImage),
     CGImageGetRenderingIntent(originalImage));
CGDataProviderRelease(imageDataProvider);
UIImage *decompressedImage = [UIImage imageWithCGImage:image];
CGImageRelease(image);

Bu kod ile ticarette sorunsuz görüntü daha fazla bellek kullanır ama render daha hızlı olur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 30GB

    30GB

    14 AĞUSTOS 2006
  • MattSteffanina 2

    MattSteffani

    28 Kasım 2007
  • ODN

    ODN

    26 Kasım 2006