4 Stimmen

Wie man ein Spiel auf Android Canvas mit vielen Primitiven zeichnet

In meinem Spiel zeichne ich in jedem Frame eine Menge Linienrechtecke - es ist eine Nachbildung eines elektronischen Handheld-Spiels der alten Schule. Diejenigen, die grobe Punktmatrix-Display für das Hauptspiel und benutzerdefinierte Bilder für Text oder einige Bilder hatte.

Ich habe 20x20 große "Pixel" auf einem virtuellen Punktmatrix-Bildschirm, ich zeichne auch einige 7-Segment-Anzeigen auf dem Bildschirm und einige andere Dinge.

Laut TraceView wird die meiste Zeit mit den Methoden drawLine und drawRectangle verbracht, weil es einfach zu viele davon gibt. Ich zeichne jedes 'Pixel' der Punktmatrixanzeige und jedes Segment der 7-Segment-Anzeigen in jede Rahmen.

Mir kam eine Optimierung in den Sinn, dass ich nur die Pixel/Segmente neu malen würde, die sich verändert haben, also habe ich den vorherigen Zustand der Pixel/Segmente gespeichert und versucht, nur die veränderten neu zu malen. Im Grunde ist es eine grobe Invalidierung.

Ich hatte erwartet, dass die Leinwand so bleiben würde, wie sie war, nachdem der letzte Rahmen fertig bemalt war, und dass ich nur das Nötigste neu streichen würde.

Leider flackerte mein Canvas auf schwarz und ab und zu, wenn sich der Zustand meines Bildschirms änderte, flackerten nur Pixel der Punktmatrixanzeige/-segmente für einen Frame auf. Und ich habe sichergestellt, dass ich meine Leinwand nicht gelöscht habe.

Ich zeichne auf einem Canvas innerhalb einer SurfaceView und aktualisiere den Thread, so wie es im Lunar Lander Android-Beispiel beschrieben ist. Im Lunar Lander-Beispiel wird alles in jedem Frame neu gemalt.

Vielleicht könnte ich alles zu einer Bitmap auf dem ersten Frame rendern, dann aktualisieren Sie diese Bitmap auf jedem anderen Frame?

Welche Technik sollte ich für meine paint()-Methode verwenden?

2voto

cris.h Punkte 233

SurfaceHolder.unlockCanvasAndPost() tatsächlich tut Page Flipping auf der Oberfläche, so dass selbst wenn der vorherige Frame nicht gelöscht wurde, würden Sie die 2nd ältesten Frame, nicht die, die Sie gerade gezeichnet erhalten. und tun lock() auf einer Oberfläche instanziiert eine neue Leinwand jedes Mal, die wahrscheinlich tut das Clearing in seinem Konstruktor.

Du bist besser dran, wenn du in eine Bitmap zeichnest, wie jemand vorgeschlagen hat, und dann jedes Mal, wenn du das Bild auf dem Display darstellen willst, drawBitmap auf die Leinwand zeichnest. Sie können eine Leinwand von einer Bitmap erwerben, um in sie zu zeichnen

und wie jemand anderes vorgeschlagen (sehr zweideutig), können Sie Sprites für die Dot-Matrix-Anzeige generieren und diese direkt aus einem Cache von Bitmaps zeichnen, anstatt mit primitiven Befehlen zu zeichnen. d.h. für einen Dot-Matrix-Rechner könnten Sie alle 0-9 in 10 Bitmaps generieren und sie einfach auf die Leinwand blitzen, anstatt eine Reihe von drawLine/Rect-Operationen aufzurufen.

Wenn die oben genannten immer noch zu langsam sind, gibt es noch Opengl, das die Vorteile der Hardware-Beschleunigung nutzt

0voto

Vladislav Rastrusny Punkte 28645

Warum sollte man sich nicht für Sprites ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X