SORU
14 Ocak 2010, PERŞEMBE


Hızlı Bitmap Android SDK İçin Bulanıklık

Şu anda geliştirmekte olduğum bir Android uygulaması olarak bulanık bir görüntünün piksel olarak değiştiriyorum. Bu 640 x 480 görüntü yaklaşık 30 saniye sürer.

Android Market apps özelliği bulanıklık ve bulanıklık içeren bir rastladım tarama çok hızlı (5 saniye gibi) ise çok bulanık, farklı bir yöntem kullanıyor olmalılar.

Herkes daha hızlı bir şekilde piksel döngü dışındaki biliyor musun?

CEVAP
16 NİSAN 2014, ÇARŞAMBA


Rehberi 2014 Bulanıklık Android

with Showcase/Benchmark App Source on Github

Bir sürü deneme yaptıktan sonra artık Android Çerçeve kullanırken hayatın Android eaiser yapacak bazı somut öneriler vermek safley edebilirim.

Yük ve Kullanımı Bitmap (çok bulanık görüntüler için) downscaled

Hiç bir bit Eşlem tam bir boyutu kullanın. Görüntü daha bulanık olması gerekir ve aynı zamanda daha yüksek bir yarıçapı olması gerekiyor bulanıklık ve genellikle, yüksek bulanıklık yarıçapı algoritma daha yavaş daha büyük.

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap blurTemplate = BitmapFactory.decodeResource(getResources(), R.drawable.myImage, options);

Bu inSampleSize 8, orijinal görüntünün sadece 1/64 ile bit eşlem yükler. İnSampleSize sizin ihtiyaçlarınıza uygun olanı Test, ama 2^n (2,4,8,...) aşağılayıcı kaliteli önlemek için Ölçekleme nedeniyle tutun. See Google doc for more

Gerçekten büyük bir avantaj bitmap yükleme çok hızlı olacak. Benim erken bulanık boyunca en uzun süre işlem bulanıklık farkettim testleri resim yükleme oldu. Bu bulanıklık sadece bir 250 ms alırken veya Nexus 5 Gerekli benim 500ms diskten 1920 x 1080 bir görüntü yüklemek için.

Renderscript Kullanın

Renderscript bir Gauss olan ScriptIntrinsicBlur filtre bulanıklık sağlar. İyi bir görsel kalite var ve sadece realisticly Android üzerinde en hızlısıdır. Google "typically 2-3x faster than a multithreaded C implementation and often 10x faster than a Java implementation" olduğunu iddia ediyor. Renderscript gerçekten sofistike (kullanarak fastes işleme aygıt (GPU, ISS,vb.), vb.) ve aynı zamanda v8 support library for it making it compatible down to 2.2 var. En azından teorik olarak, benim kendi test raporları ve diğer geliştiriciler gibi görünüyor bu mümkün değil kullanın renderscript körü körüne beri donanım/sürücü parçalanma gibi sorunlara neden Bazı cihazlar bile daha yüksek sdk level (örn vardı sorunları ile 4.1 Nexus S) Bu yüzden dikkatli olun ve test bir sürü cihazlar. İşte size bir başlangıç olacak basit bir örnek

//define this only once if blurring multiple times
RenderScript rs = RenderScript.create(context);

(...)
//this will blur the bitmapOriginal with a radius of 8 and save it in bitmapOriginal
final Allocation input = Allocation.createFromBitmap(rs, bitmapOriginal); //use this constructor for best performance, because it uses USAGE_SHARED mode which reuses memory
final Allocation output = Allocation.createTyped(rs, input.getType());
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setRadius(8f);
script.setInput(input);
script.forEach(output);
output.copyTo(bitmapOriginal);

Özellikle Google "because they include the latest improvements", tavsiye ettiği Gradle ile v8 destek, kullanırken sadece 17* *ve mevcut yapı araçları (updated syntax for android gradle plugin v14 ) android.support.v8.renderscript kullanın

android {
    ...
    defaultConfig {
        ...
        renderscriptTargetApi 19
        renderscriptSupportModeEnabled true
    }
}

Bir Kıyaslama Nexus basit 5 - diğer java ve renderscript uygulamaları ile karşılaştırılması RenderScript:

The average runtime per blur on different pic sizes Farklı boyutları pic bulanıklık başına ortalama çalışma zamanı

Megapixels per sec that can be blurred Bulanık olabilir saniye başına mega piksel

Her değeri 250 mermi Ort. RS_GAUSS_FAST ScriptIntrinsicBlur (ve neredeyse her zaman en hızlı), RS_ ile başlayan Diğerleri basit çekirdekler ile çoğunlukla convolve uygulamaları vardır. The details to the algorithms can be found here. Bu tamamen bulanık değil, ama iyi bir alan ölçülür ve çöp toplama. Bu işte (100x100ScriptIntrinsicBlur yaklaşık 500 mermi ile resim) görülebilir

enter image description here

Sivri gc.

Kendiniz kontrol edebilirsiniz, kıyaslama uygulaması playstore: BlurBenchmark

Yeniden tersine mümkün olan her bit Eşlem (eğer prio: performans >bellek) ayak izi

Eğer bulanıklık veya benzer ve canlı bir hafıza için birden fazla bulanıklaştırır drawables birden çok kez gelen bitmap yük, ama "" bir üye değişkeni. önbelleğe tutmak bunu yok izin gerekiyorsa Bu durumda hep aynı değişkenler, çöp toplama minimumda tutmak için kullanmayı deneyin.

Ayrıca bir dosyadan "inBitmap" option when loading yeni çek veya bitmap bellek yeniden hangi drawable ve çöp toplama zaman kazandırır.

Keskin bir bulanıklık uygulamak için

Basit ve naiive yöntemi sadece 2 imageviews kullanmak için, bir bulanık ve alfa onları solmaya. Ama eğer düzgün keskin bir bulanıklık kaybolur daha sopisticated bir bak istersen sonra Roman Nurik's post about how to do it like in his Muzei app check out.

Temelde-bulanıklaştırır o önceden farklı uzatır bulanıklık ile bazı kareleri belirtiyor ve gerçekten düzgün görünen bir animasyon kareleri olarak kullanıyor

Diagram where Nurik exaplains his approach

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Distractify

    Distractify

    1 Aralık 2011
  • KoreanFrogMania님의 채널

    KoreanFrogMa

    18 Aralık 2011
  • oHeymarvin

    oHeymarvin

    11 Temmuz 2013