2011-06-29 4 views
3

est un peu suivi à ma dernière question: Canvas is drawing too slowlyLe moyen le plus rapide pour charger et afficher un jpeg sur un SurfaceView? Ce

Maintenant que je peux dessiner des images plus rapidement, le problème que je suis confronté à est que le chargement réel des images prend beaucoup trop longtemps.

Dans l'application sur laquelle je travaille, l'utilisateur peut lire des images vidéo (jpeg) successivement, comme s'il regardait la vidéo en temps réel. J'ai utilisé BitmapFactory.decodeFile() pour charger chaque jpeg dans un bitmap. Je ne parviens pas à charger toutes les images à la fois car il y en a environ 240, et cela utiliserait tout mon espace mémoire. Ce que j'ai fait est de précharger jusqu'à 6 à la fois dans un tableau au moyen d'un fil séparé afin de réduire le temps nécessaire à l'affichage de chaque image.

Malheureusement, il faut entre 50 et 90 ms pour charger une image, et j'ai besoin d'afficher une image toutes les 42 ms. Existe-t-il un moyen plus rapide de charger des images? Pour plus de clarté, ces images se trouvent dans un dossier de la carte SD et sont toutes en format JPEG 720 x 480. Je les échantillonne à la moitié de cette taille pour réduire l'utilisation de la mémoire.

+0

Avez-vous remarqué une différence lors de l'utilisation de la mémoire interne ou lors de l'utilisation de png au lieu de jpeg? – mibollma

+0

Je n'ai pas encore essayé la mémoire interne, je suppose que j'essaierai ensuite. J'ai commencé en utilisant png, mais ils étaient beaucoup plus grands que jpeg et les jpeg prennent déjà environ 8 Mo sur l'appareil. – BigFwoosh

+0

Cela semble un peu plus rapide d'utiliser la mémoire interne, mais ce n'est pas encore assez rapide pour ce que je fais. Je pense que ce dont j'ai vraiment besoin, c'est d'un moyen de stocker toutes les images sans sacrifier la qualité. Je peux les stocker tous en mémoire si j'ai défini inSampleSize sur 4, mais la qualité baisse considérablement. – BigFwoosh

Répondre

1

J'ai fini par faire cela un peu différemment de ce que j'avais initialement imaginé. Il était tout à fait un peu à elle, mais voici l'essentiel de ce que j'atteint mon objectif:

  1. Toutes les images sont stockées sur la carte SD et écrite dans un fichier (chaque image prend X octets dans le fichier)
  2. utilisation du code natif pour lire et écrire dans le fichier d'image
  3. Lors d'une demande d'une image, je passe l'index de l'image dans la liste et un objet bitmap (RGB_565) à l'aide du code natif en utilisant une enveloppe JNI
  4. le le code natif verrouille la surface bitmap, écrit les données de pixel (en tant que uint8_t **) directement sur le bitmap, puis le déverrouille
  5. L'image est rendue à l'écran

En faisant cela, j'avais seulement besoin de stocker une image en mémoire à la fois, et j'étais capable de contourner le garbage collection (puisque le bitmap a été créé seulement une fois et puis repeuplé nativement). J'espère que quelqu'un d'autre pourrait trouver cette stratégie utile.

0

Vous avez déjà essayé toutes les méthodes dans ce tutoriel http://www.higherpass.com/Android/Tutorials/Working-With-Images-In-Android/2/ et choisi le plus rapide. Peut-être que modifier le redimensionnement peut réduire le temps de chargement.

Le meilleur serait bien sûr de ne pas avoir à redimensionner les images. Si vous avez le contrôle total des images, vous pouvez peut-être essayer de les emballer comme des sprites, voir l'article http://www.droidnova.com/2d-sprite-animation-in-android,471.html

+0

Malheureusement, je vais devoir redimensionner les images car de nombreux appareils Android peuvent aujourd'hui enregistrer des vidéos en haute résolution, mais leurs dimensions d'écran sont plus petites. Je ne peux pas non plus référencer les images en tant que ressources, car elles sont générées à partir d'un fichier vidéo sur le périphérique lors de l'exécution.Je suppose que je peux voir à propos du redimensionnement des images au fur et à mesure qu'elles sont générées. – BigFwoosh

Questions connexes