android pixel rapide d'accès et de manipulation
J'essaie de port un émulateur que j'ai écrit en java pour android. Tout va bien, j'ai été capable de port la plupart de mes codes, avec des changements mineurs mais en raison de la façon dont l'émulation fonctionne, j'ai besoin d'effectuer un rendu de l'image au niveau du pixel.
Comme pour desktop java j'utilise
int[] pixelsA = ((DataBufferInt) src.getRaster().getDataBuffer()).getData();
qui me permettent d'obtenir la référence à l'pixel de la mémoire tampon et le mettre à jour à la volée(de minimiser les créations objet)
Actuellement c'est ce que mon émulateur pour android n'a pour chaque trame
@Override
public void onDraw(Canvas canvas)
{
buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565);
canvas.drawBitmap(buffer, 0, 0, null);
}
pixelsA est un tableau int[], pixelsA contient toutes les couleurs d'informations, de sorte que chaque cadre, il sera nécessaire de créer un objet bitmap en faisant
buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565);
qui je crois est assez lent et coûteux.
Est-il possible de dessiner des pixels de manière efficace, avec de la toile?
OriginalL'auteur afro100 | 2011-09-29
Vous devez vous connecter pour publier un commentaire.
L'un d'assez bas niveau de la méthode, mais fonctionne très bien pour moi (avec du code natif):
Créer
Bitmap
objet, aussi grande que votre écran visible.Également créer un
View
objet et de mettre en œuvreonDraw
méthode.Puis en code natif, vous auriez la charge libjnigraphics.donc, à la bibliothèque native, fonctions de recherche,
AndroidBitmap_lockPixels
etAndroidBitmap_unlockPixels
.Ces fonctions sont définies dans Android source en bitmap.h.
Alors vous feriez appel de verrouillage/déverrouillage sur un bitmap, adresse de réception à raw pixels. Vous devez interpréter le format RGB des pixels en fonction de ce qu'il est vraiment (16 bits 565 32-bit ou 8888).
Après la modification du contenu de l'image bitmap, vous voulez présenter à l'écran.
Appel
View.invalidate()
sur votreView
. Dans sononDraw
, blit votre image bitmap dans le mêmeCanvas
.Cette méthode est très faible et dépendante de la mise en œuvre effective de Android, cependant il est très rapide, vous pouvez obtenir 60fps pas de problème.
bitmap.h est partie d'Android NDK depuis la plateforme de la version 8, c'EST donc officiel pour ce faire, à partir d'Android 2.2.
OriginalL'auteur Pointer Null
Vous pouvez utiliser le drawBitmap méthode qui évite de créer une image Bitmap à chaque fois, ou même en dernier recours, de dessiner les pixels un par un avec drawPoint.
Bon à savoir, il a travaillé. Comme vous le dites il n'y a rien aussi vite que les natifs, mais c'est beaucoup plus complexe.
OriginalL'auteur Mister Smith
Ne pas recréer l'image bitmap à chaque fois. Essayez quelque chose comme ceci:
EDIT: comme l'a souligné, vous avez besoin de mettre à jour le pixel de la mémoire tampon. Et le bitmap doit être mutables pour que cela se produise.
OriginalL'auteur Femi
si pixelsA est déjà un tableau de pixels (qui est ce que je déduis de votre déclaration sur le contenant de couleurs), alors vous pouvez simplement vous rendre directement sans avoir à les convertir avec:
OriginalL'auteur Justin Buser