API-Referenz: Picture & PictureRecorder
Wenn Sie dieselbe komplexe Szene mehrmals zeichnen müssen – oder wenn Sie einen statischen Hintergrund haben, der sich nicht ändert – sollten Sie Picture verwenden. Es zeichnet Ihre Zeichenbefehle in einem hochoptimierten Format auf, das Skia viel schneller "abspielen" kann, als wenn es in jedem Frame einzelne Java-Aufrufe ausführen müsste.
Der Arbeitsablauf
Das Aufzeichnen eines Bildes erfolgt mit einem PictureRecorder, um einen temporären Canvas zu erhalten.
java
PictureRecorder recorder = new PictureRecorder();
// 1. Definieren Sie den "Cull Rect" (den Bereich, den Sie zeichnen möchten)
Canvas recordingCanvas = recorder.beginRecording(Rect.makeWH(500, 500));
// 2. Führen Sie Ihre Zeichenbefehle wie gewohnt aus
Paint p = new Paint().setColor(0xFF4285F4);
recordingCanvas.drawCircle(250, 250, 100, p);
// ... weitere Zeichenbefehle ...
// 3. Beenden Sie die Aufzeichnung und erhalten Sie das Picture-Objekt
Picture picture = recorder.finishRecordingAsPicture();PictureRecorder API
Der PictureRecorder ist das zustandsbehaftete Objekt, das zum Aufzeichnen von Befehlen verwendet wird.
beginRecording(bounds): Startet die Aufzeichnung. Gibt einenCanvaszurück, in den Sie zeichnen können. Alle an diesen Canvas gesendeten Zeichenbefehle werden gespeichert.getRecordingCanvas(): Gibt den aktiven Aufzeichnungs-Canvas zurück odernull, wenn nicht aufgezeichnet wird.finishRecordingAsPicture(): Beendet die Aufzeichnung und gibt das unveränderlichePicture-Objekt zurück. Macht den Aufzeichnungs-Canvas ungültig.finishRecordingAsPicture(cullRect): Beendet die Aufzeichnung, überschreibt jedoch den im Bild gespeicherten Cull Rect.
Bilder erstellen (Serialisierung)
makePlaceholder(cullRect): Erstellt ein Platzhalterbild, das nichts zeichnet, aber bestimmte Grenzen hat.makeFromData(data): Deserialisiert ein Bild aus einemData-Objekt (erstellt überserializeToData).
Das Bild zeichnen
Sobald Sie ein Picture-Objekt haben, können Sie es auf jeden anderen Canvas zeichnen.
java
canvas.drawPicture(picture);Warum Picture verwenden?
- Leistung: Wenn Sie 1.000 Zeichenaufrufe haben, muss Java pro Frame 1.000 Mal in nativen Code aufrufen. Wenn Sie diese in ein
Pictureaufzeichnen, ist es nur ein nativer Aufruf pro Frame. - Thread-Sicherheit: Während ein
Canvasan einen Thread gebunden ist, ist einPictureunveränderlich und kann von jedem Thread aus gezeichnet werden (normalerweise zeichnen Sie es jedoch in Ihrem Haupt-Rendering-Thread). - Tessellierungs-Caching: Skia kann die komplexe Geometrie (wie Pfade) innerhalb eines
Picturebesser zwischenspeichern als bei einzelnen Aufrufen.
Best Practices & Fallstricke
- Nicht alles aufzeichnen: Wenn sich Ihr Inhalt in jedem einzelnen Frame ändert (wie eine sich bewegende Figur), könnte das Aufzeichnen eines neuen
Picturejedes Mal aufgrund des Overheads des Recorders tatsächlich langsamer sein. - Canvas-Lebensdauer: Der
Canvas, den Sie vonbeginRecording()erhalten, ist nur gültig, bis SiefinishRecordingAsPicture()aufrufen. Versuchen Sie nicht, eine Referenz darauf zu behalten! - Speicher: Pictures belegen nativen Speicher. Wenn Sie viele kleine Bilder erstellen, denken Sie daran, sie mit
close()zu schließen, wenn sie nicht mehr benötigt werden.