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?
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.
Sie können die drawBitmap-Methode , die es vermeidet, jedes Mal ein Bitmap zu erstellen, oder sogar als letzten Ausweg, die Pixel nacheinander mit
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%Tags und Links android image android-canvas pixel draw