2012-04-20 22 views
7

FFmpeg tabanlı bir film oynatıcı oluşturdum. İyi çalışıyor. Çözme oldukça hızlı, LG P970 (Neon ile Cortex A8) Ben YUV2RGB dönüşüm de dahil olmak üzere 640 x 424 çözünürlükte video akışı ile ortalama 70 fps var. Ancak, bir darboğaz var. Tuval üzerine çiziyor.Android'de bitmap çiziminin performansı nasıl artırılır

Resim verilerini yerel taraftaki bitmap'e doldurmak için jnigraphics yerel kütüphanesini kullanıyorum ve bu bitmapi SurfaceView'da Canvas üzerine çiziyorum. Oldukça basit ve ortak bir yaklaşımdır, ancak çizim 640 x 424 çözünürlükte bitmap için 44 ms alır, bu da fps'yi 23'e düşürür ve bu tekniği kullanılamaz hale getirir ... Tüm A/V kare kod çözme işlemi çok daha fazla zaman alır!

Bitmap'lerin nasıl daha hızlı çizileceği herhangi bir yöntem var mı? OpenGLES 2'yi kullanarak tamamen yerel kodları oluşturmayı tercih ederim, fakat ben de okudum ki slow da olabilir. Peki şimdi ne olacak? ...

Bitmap'leri olabildiğince hızlı nasıl yapabilirim?

+0

yolu yoktur? Kamera Önizleme bu afaik yapar. – zapl

+0

AFAIK no, NDK kullanılarak en az standart yol yoktur. Tabii ki, Android kaynakları ile bağlantı kurmak mümkündür, ancak uyumluluk ile sorunlara neden olur ... – vitakot

cevap

3

Onları GLES1.x'de çizin. GLES2'yi kullanmayacağınız gibi, GLES2.x'in kullanılmasının genel nedenlerinden biri olan gölgelendiriciler için, hiçbir zaman kullanamayacaksınız ya da en azından sizin sorunuzun bağlamında kullanmanıza gerek yoktur. Yani sadelik için, GLES1.x ideal olurdu. Yapmanız gereken tek şey ekrana bytebuffer çizmektir. Galaxy S'de (Canlı) bu yaklaşık 3 ms sürer. Duvar kağıdındaki bayt [] boyutu, üzerinde çalıştığınızdan önemli ölçüde daha büyük olan 800x480x3 veya 1152000'dir.

Bu kılavuzun sizi doğru yönde göstermesi gerektiğine inanıyorum.

http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

yerel koddan tuval erişen kavramı gelince, ben sadece bu tamamen önleyeceğini ve mümkün olduğunca GPU'ya herşeyi boşaltma tarafından bir OpenGL uygulamasını takip edin.

+0

Teşekkürler, haklısınız; OpenGLES1.x'e geri döneceğim. Open GL ile hiç tecrübem yok, bu yüzden benim varsayımın daha yeniydi. Makaleyi sağladığınız bağlantıda okudum. Aslına bakarsanız, iOS platformunda bile Google'ın benim için bulabildiği ilgili tüm makaleleri okumuş olmalıyım ... Bir gün araştırma yaptıktan sonra hala biraz kayboldum. – vitakot

+0

Her iki sürüm de aynı donanıma erişir. 2.0'daki güç, erişebileceğiniz ek donanımdan geliyor (gölgelendirici işlemciler). Öyleyse, bu ışıkta söylenenin zor olduğunu düşündüğümün daha iyi ya da daha kötü olması, başarmak için neye ihtiyacınız olduğuna karar vermek kadar basittir. –

2

Çoğaltma Adası sunumu sırasında GoogleIO'da tasarımcıyı hatırladım, OpenGL 'draw_texture' uzantısının glDrawTexfOES 'u kullanmanın en hızlı yolunu ekrana karıştırmanın en hızlı yolu olduğunu ve ekli dokularla normal dörtlüleri çizmekten çok daha hızlı olduğunu söyledim (Ben OpenGL kullandığınızı varsayarak).

Dokuyu döndürebilirsiniz, ancak buna ihtiyacınız olduğu gibi gelmiyor. SurfaceView arabelleğine doğrudan yerel koddan erişmek için

+0

Haklısın, rotasyon umrumda değil. Bahsettiğiniz işlevi kullanan OpenGLES1.x (https://github.com/richq/glbuffer) kullanarak güzel bir örnek buldum. – vitakot

İlgili konular