2010-11-04 3 views
3

Je travaille sur une application Android qui traite des opérations graphiques en code natif sur un tampon de mémoire partagée. J'ai fait des fonctions pour appeler mon code natif à partir de Java en utilisant JNI, et mon code natif utilise l'API JNI pour appeler Java à partir du code natif. Étant donné que la copie de grandes baies de pixels a un effet significatif sur les performances, je dois l'éviter le plus possible.Android copyPixelsFromBuffer() à un décalage de bitmap particulier?

La documentation applications pour les négociations de classe Bitmap de deux façons pour copier des pixels sur la mémoire tampon interne Bitmap: http://developer.android.com/reference/android/graphics/Bitmap.html

setPixels (int [] pixels, int offset, foulée int, int x, int y, int width, int height) Remplacez les pixels du bitmap par les couleurs du tableau. CopyPixelsFromBuffer (Buffer src) Copie les pixels du tampon, en commençant à la position actuelle, en écrasant les pixels du bitmap.

Le problème avec la documentation API est qu'elle est très vague sur ce qui se passe dans les coulisses lorsque vous utilisez ces fonctions. Cependant, il est mentionné quelque part que copyPixelsFromBuffer() copie les pixels directement sans aucune conversion de format de couleur interne, contrairement à setPixels() qui fera dans tous les cas cette conversion même si les pixels originaux sont dans le format de pixel cible. Évidemment, ce n'est pas quelque chose que je veux, puisque les pixels dans mon tampon sont déjà dans le bon format. Maintenant, copyPixelsFromBuffer() semble très bien car il ne fera pas cette conversion, mais la documentation ne parle pas de la façon de copier les pixels d'un tampon à un offset particulier dans le bitmap cible. Oups, c'est quelque chose de très important, puisque je ne veux pas copier le tampon entier à chaque fois, mais seulement une région dessus. Oui, la documentation indique qu'il va copier à partir de la position actuelle dans le tampon source mais rien n'est dit sur le tampon de destination. SetPixels() effectue la conversion inutile, mais vous permet de spécifier un décalage dans le tampon de destination.

Donc, je suis coincé entre:

copie seulement la région que je veux au prix d'avoir la conversion de pixels

OU

Éviter la conversion de pixels au coût de la copie du tampon entier chaque Pour avoir une idée, je peux avoir un tampon représentant un écran 1024x768, avec une région invalide qui va de (300.300) à (400.400). Si je ne copie que la zone à mettre à jour, je peux copier et convertir 100 * 100 pixels ou copier sans convertir 1024 * 768 pixels. une région invalide 100x100 est petite et seulement un cas particulier, la plupart des régions invalides prendraient une plus grande partie du tampon. Les deux méthodes ont des effets très négatifs sur les performances.

Est-ce que quelqu'un a une idée sur la façon dont je pourrais copier des pixels de mon tampon à un décalage particulier sur le tampon cible, sans conversion forcée de pixels? Ce serait le meilleur des deux mondes, et je ne vois pas pourquoi cela ne semble pas être disponible.

Merci beaucoup pour votre aide

Répondre

0

Je pense peut-être la fonction ne prend pas une destination de décalage car il utilise simplement automatiquement la source de décalage pour la source et la destination. Tu devrais l'essayer.

-n

+0

Je pensais la même chose, mais la mise en œuvre effective de copyPixelsFromBuffer suggère autrement: http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob; f = graphiques/java/android/graphics/Bitmap.java; h = 7ca374164096b55ce609d79c1914efc7a5575722; hb = maître – awakecoding

Questions connexes