Android schnelle Pixelzugriff und Manipulation

8

Ich versuche einen Emulator, den ich in Java geschrieben habe, auf Android zu portieren. Die Dinge liefen gut, ich konnte die meisten meiner Codes mit kleinen Änderungen portieren, aber aufgrund der Funktionsweise der Emulation muss ich das Bild auf Pixelebene rendern.

Wie für Desktop-Java verwende ich

%Vor%

, die es mir ermöglichen, den Verweis auf den Pixelpuffer zu erhalten und ihn im laufenden Betrieb zu aktualisieren (minimieren Sie die Objektkreationen)

Momentan ist das, was mein Emulator für Android für jeden Frame macht

%Vor%

pixelsA ist ein Array int [], pixelsA enthält alle Farbinformationen, also muss jeder Frame ein Bitmap-Objekt erzeugen, indem man

tut %Vor%

was ich glaube, ist ziemlich teuer und langsam.

Gibt es eine Möglichkeit, Pixel effizient mit Canvas zu zeichnen?

    
afro100 29.09.2011, 07:22
quelle

4 Antworten

10

Eine ziemlich Low-Level-Methode, aber funktioniert gut für mich (mit nativem Code):

Erstellen Sie Bitmap -Objekt, so groß wie Ihr sichtbarer Bildschirm. Erstellen Sie auch ein View -Objekt und implementieren Sie onDraw method.

Dann würden Sie im systemeigenen Code die systemeigene Bibliothek libjnigraphics.so und die Suchfunktionen AndroidBitmap_lockPixels und AndroidBitmap_unlockPixels laden. Diese Funktionen sind in der Android-Quelle in bitmap.h definiert.

Dann würden Sie Sperren / Entsperren auf einer Bitmap aufrufen und die Adresse an rohe Pixel übergeben. Sie müssen das RGB-Format der Pixel entsprechend dem, was es wirklich ist, interpretieren (16-Bit 565 oder 32-Bit 8888).

Nachdem Sie den Inhalt der Bitmap geändert haben, möchten Sie dies auf dem Bildschirm anzeigen. Rufen Sie View.invalidate() auf Ihrem View auf. Kopiere in deinem onDraw dein Bitmap in die angegebene Canvas .

Diese Methode ist sehr niedrig und abhängig von der tatsächlichen Implementierung von Android, aber es ist sehr schnell, Sie können 60fps kein Problem bekommen.

bitmap.h ist seit der Plattformversion 8 Bestandteil von Android NDK, also ist dies ein offizieller Weg, dies von Android 2.2 aus zu tun.

    
Pointer Null 29.09.2011 07:38
quelle
4

Sie können die drawBitmap-Methode , die es vermeidet, jedes Mal ein Bitmap zu erstellen, oder sogar als letzten Ausweg, die Pixel nacheinander mit drawPoint .

>     
Mister Smith 29.09.2011 08:29
quelle
0

Erstellen Sie die Bitmap nicht jedes Mal neu. Versuchen Sie etwas wie folgt:

%Vor%

EDIT: Wie bereits erwähnt, müssen Sie den Pixelpuffer aktualisieren. Und die Bitmap muss veränderbar sein, damit das passiert.

    
Femi 29.09.2011 07:35
quelle
0

Wenn pixelsA bereits ein Array von Pixeln ist (was ich aus Ihrer Aussage über das Enthalten von Farben ableiten würde), dann können Sie sie einfach direkt rendern, ohne mit:

zu konvertieren %Vor%     
Justin Buser 15.06.2012 01:28
quelle