android schnell pixel Zugriff und manipulation
Ich versuche, port-emulator, den ich geschrieben habe in java auf android. Es läuft alles schön, ich war in der Lage zu Hafen, die meisten meiner codes mit geringfügigen änderungen, aber aufgrund wie die emulation funktioniert, brauche ich zum Rendern Bild auf pixel-Ebene.
Als für desktop-java-ich verwende
int[] pixelsA = ((DataBufferInt) src.getRaster().getDataBuffer()).getData();
die es mir erlauben, um den Verweis auf das pixel-buffer und aktualisieren Sie es on-the-fly(minimieren-Objekt erstellen)
Derzeit das ist, was mein emulator für android hat für jeden Rahmen
@Override
public void onDraw(Canvas canvas)
{
buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565);
canvas.drawBitmap(buffer, 0, 0, null);
}
pixelsA ist ein array int[], pixelsA enthält alle Farbe Informationen, so dass jeder Rahmen, es wird ein bitmap-Objekt zu tun
buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565);
denen ich glaube, dass ist ziemlich teuer und langsam.
Gibt es eine Möglichkeit zum zeichnen von Pixeln effizient mit der Leinwand?
- Stimmt, createBitmap langsam, Speicher zu kopieren, und selbst die Konvertierung von pixel-format in Ihrem Fall!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer ziemlich low-level-Methode, aber funktioniert gut für mich (mit native-code):
Erstellen
Bitmap
Objekt, so groß wie dein Bildschirm sichtbar.Auch eine
View
Objekt und implementierenonDraw
Methode.Dann in nativen code, den Sie laden würde libjnigraphics.also native Bibliothek, lookup-Funktionen
AndroidBitmap_lockPixels
undAndroidBitmap_unlockPixels
.Diese Funktionen sind definiert in Android-Quelle in bitmap.h.
Dann würde man sperren/entsperren, auf eine bitmap, erhalten Adresse, um raw-Pixel. Sie müssen interpretieren, RGB-format der Pixel, die entsprechend zu dem, was es wirklich ist (16-bit 565-oder 32-bit-8888).
Nach der änderung Inhalt der bitmap, die Sie wollen, um diese auf dem Bildschirm.
Rufen Sie
View.invalidate()
auf IhreView
. In seineronDraw
, blit Ihre bitmap in bestimmtenCanvas
.Diese Methode ist sehr "low level" und abhängig von der tatsächlichen Umsetzung auf Android, aber es ist sehr schnell, Sie kann bekommen 60fps kein problem.
bitmap.h ist Teil des Android NDK, da Plattform-version 8, das IST also die offizielle Möglichkeit, dies zu tun von Android 2.2.
Können Sie die Methode drawBitmap, vermeidet das erstellen einer Bitmap jedes mal, oder sogar-als letztes Mittel-zeichnen die Pixel einzeln mit drawPoint.
Nicht erstellen Sie die bitmap-jede einzelne Zeit. Probieren Sie etwas wie dieses:
EDIT: so wies Sie müssen aktualisieren Sie den pixel-buffer. Und die bitmap muss verändert werden, damit das passiert.
wenn pixelsA ist bereits ein array von Pixeln (das ist, was ich würde folgern aus Ihrer Aussage über mit Farben), dann kannst du einfach machen Sie direkt ohne Konvertierung mit: