2016-03-26 18 views
3

Uygulamam RenderScript'e dayalı Canny kenar algılamasının tescilli bir uygulamasını kullanır. Bunu çeşitli API'larla çok sayıda cihazda test ettim ve çok güvenilir bir şekilde çalıştı. Şimdi yeni Samsung S7, API23 üzerinde çalışıyor. Burada (ve sadece burada) oldukça çirkin bir problemle karşılaştım. Bazı kenar resimleri, Büyüklük gradyan hesaplama çekirdeğinden kaynaklanan ve gerçek görüntü bilgisine dayanmayan binlerce eserle süslenir. Her türlü TargetAPI'leri denedikten sonra, renderscript.support.mode'u açıp kapatarak, vb. Sonunda, problemin sadece RenderScript (ve Script) örnekleri ikinci veya daha fazla kez kullanıldığında ortaya çıktığını keşfettim. İlk defa kullanıldıklarında ortaya çıkmaz.API 23'de karşılaşılan RenderScript kararsızlığı

Verimlilik nedenleriyle, RenderScript ve Komut Dosyası örneklerini, onCreate MainActivity yönteminde bir kez oluşturdum ve daha sonra tekrar tekrar kullandım. Tabi ki bunu değiştirmek istemiyorum.

Bu sorunun bir çözümü var mı? Teşekkürler.

UPDATE: Burada çılgın şeyler oluyor. Taze yaratılan Tahsisler başlangıçtan boş değil gibi görünüyor! Çalışırken:

Type.Builder typeUCHAR1 = new Type.Builder(rs, Element.U8(rs)); 
    typeUCHAR1.setX(width).setY(height); 
    Allocation alloc = Allocation.createTyped(rs, typeUCHAR1.create()); 

    byte se[] = new byte[width*height]; 
    alloc.copyTo(se); 

    for (int i=0;i<width*height;i++){ 
     if (se[i]!=0){ 
      Log.e("content: ", String.valueOf(se[i])); 
     } 
    } 

... byte Array se komik sayılarla doludur .... YARDIM! Bir fikrin, burada neler oluyor?

Update2: - Ancak, benim savunma Buranın göründüğünü sorun biraz daha ince olduğunu söylemek gerekir .... Bu başyapıt için bir noktayı hak etmiyorum gerçekten ve Benim burada kendi cehalet üzerinde tökezledi . Bağlam, başlangıçta boş olması gereken (yani sıfır) ve daha sonra, rsSetElementAt_uchar() aracılığıyla kernelin kısmen (sadece kenarların olduğu) 1'e ayarlandığı bir global tahsisi (Byte/U8) atamam gerektiğiydi. Bu aylar boyunca çalıştığından beri, artık bu tahsisatta sıfırları tahsis etmediğim gerçeğinin artık farkında değildim .... Bu sadece API 23'teki sonuçlara sahipti, bu yüzden belki de başkalarının içine düşmemesine yardımcı olabilir Bu tuzak .... Yani, not: 0 ile doldurulmuş sayısal Diziler dışında (Java varsayılan olarak), Tahsis başlatma sırasında Sıfırlar tam olarak kabul edilemez. Sağol Sakridge.

+0

İçsel mi yoksa tüm özel komut dosyaları mı kullanıyorsunuz? Özel Komut Dosyalarınızda global verileriniz var mı? Bu işlemler arasındaki Tahsisleri yeniden kullanıyor musunuz (RenderScript ve Script nesnelerini yeniden kullanmak yerine)? Sadece CPU modunda çalışmayı denemek isteyebilirsiniz (GPU ile ilgili ise). "Adb shell setprop debug.rs.default-CPU-driver 1" ı deneyin ve farklı olup olmadığını görün. –

+0

ScriptIntrinsicBlur ve YUVtoRGB (eski kamera API'sı için) kullanıyorum. Ben de problemi, yalnızca bir Sobel 5x5 konvolüsyon olan en yoğun kernel ile görüyorum (ScriptIntrinsicBlur'un daha da işe yaradığını varsayarsam da). Ve evet, bir sonraki çekirdeğimde tekrar kullandığım zaman, yeniden tahsisleri diziler halinde kopyalamama anlamında da tahsisleri yeniden yapıyorum. Aslında bu sorun sadece CPU’da çalıştırdığımda ortadan kalkar. Bunu tüm cihazlarda kalıcı hale getirmenin bir yolu var mı? – Settembrini

+0

Burada yorumunuzu http://stackoverflow.com/a/25253181/5148048 Sonuç olarak, her defasında çekirdeği kullandığımda rs örneğinin yeniden oluşturulmasından başka bir çözüm bulunmuyor. rs-run sadece CPU üzerinde gerçekleştirilir (diğer mesajlardan da görüldüğü gibi). – Settembrini

cevap

2

createFromBitmap API'sini kullanarak bitmap geçirilmedikçe, bir İlklendirme oluşturulduğunda, ilkel türler (yapı dışı/nesne) için ayırma verileri varsayılan olarak başlatılmaz. Bunu bekliyorsanız, muhtemelen uygulamanızda, sürücü 0'lar başlatıldığında ortaya çıkmayan bir hata var demektir. Sorunu yeniden üreten örnek kod gönderebilirseniz yardımcı olur.

Bir bitmap veya Java dizisinden kopyalayarak, tahsislerinizi sıfırlayın.