Référence API : Picture & PictureRecorder
Lorsque vous devez dessiner la même scène complexe plusieurs fois — ou si vous avez un arrière-plan statique qui ne change pas — vous devriez utiliser Picture. Il enregistre vos commandes de dessin dans un format hautement optimisé que Skia peut "rejouer" beaucoup plus rapidement que d'exécuter des appels Java individuels à chaque frame.
Le flux de travail
L'enregistrement d'une image implique d'utiliser un PictureRecorder pour obtenir un Canvas temporaire.
java
PictureRecorder recorder = new PictureRecorder();
// 1. Définir le "cull rect" (la zone que vous prévoyez de dessiner)
Canvas recordingCanvas = recorder.beginRecording(Rect.makeWH(500, 500));
// 2. Exécuter vos commandes de dessin comme d'habitude
Paint p = new Paint().setColor(0xFF4285F4);
recordingCanvas.drawCircle(250, 250, 100, p);
// ... plus de dessins ...
// 3. Arrêter l'enregistrement et obtenir l'objet Picture
Picture picture = recorder.finishRecordingAsPicture();API PictureRecorder
Le PictureRecorder est l'objet avec état utilisé pour capturer les commandes.
beginRecording(bounds): Commence l'enregistrement. Retourne unCanvasdans lequel vous pouvez dessiner. Toutes les commandes de dessin envoyées à ce canvas seront stockées.getRecordingCanvas(): Retourne le canvas d'enregistrement actif, ounullsi aucun enregistrement n'est en cours.finishRecordingAsPicture(): Termine l'enregistrement et retourne l'objetPictureimmuable. Invalide le canvas d'enregistrement.finishRecordingAsPicture(cullRect): Termine l'enregistrement, mais remplace le cull rect stocké dans l'image.
Création d'Images (Sérialisation)
makePlaceholder(cullRect): Crée une image de substitution qui ne dessine rien mais a des limites spécifiques.makeFromData(data): Désérialise une image à partir d'un objetData(créé viaserializeToData).
Dessiner l'Image
Une fois que vous avez un objet Picture, vous pouvez le dessiner sur n'importe quel autre Canvas.
java
canvas.drawPicture(picture);Pourquoi utiliser Picture ?
- Performance : Si vous avez 1 000 appels de dessin, Java doit appeler le code natif 1 000 fois par frame. Si vous les enregistrez dans un
Picture, ce n'est plus qu'un appel natif par frame. - Sécurité des threads : Alors qu'un
Canvasest lié à un thread, unPictureest immuable et peut être dessiné depuis n'importe quel thread (bien que vous le dessiniez généralement sur votre thread de rendu principal). - Mise en cache de la tessellation : Skia peut mieux mettre en cache la géométrie complexe (comme les chemins) à l'intérieur d'un
Pictureque pour des appels individuels.
Bonnes pratiques et pièges
- Ne pas tout enregistrer : Si votre contenu change à chaque frame (comme un personnage en mouvement), enregistrer un nouveau
Pictureà chaque fois pourrait en réalité être plus lent en raison de la surcharge du recorder. - Durée de vie du Canvas : Le
Canvasque vous obtenez debeginRecording()n'est valide que jusqu'à ce que vous appeliezfinishRecordingAsPicture(). Ne tentez pas de conserver une référence à celui-ci ! - Mémoire : Les images occupent de la mémoire native. Si vous créez de nombreuses petites images, n'oubliez pas de les
close()lorsqu'elles ne sont plus nécessaires.