Ce document fournit un aperçu complet de Parceler, une bibliothèque de génération de code pour Android qui simplifie la création d'objets Parcelable. Il détaille les fonctionnalités de Parceler, notamment les types de données pris en charge, les techniques de sérialisation, la gestion du polymorphisme et les configurations avancées, ainsi que l'intégration avec d'autres bibliothèques Android populaires. La dernière partie présente Mitsuba 3, un système de rendu orienté recherche, décrivant ses fonctionnalités, son installation et son utilisation.
Colisier
Vous avez une question ? Demandez-le sur StackOverflow.
Vous avez trouvé un problème ? Veuillez le signaler.
Sous Android, les Parcelables constituent un excellent moyen de sérialiser des objets Java entre contextes.
Par rapport à la sérialisation traditionnelle, les Parcelables prennent environ 10 fois moins de temps à sérialiser et à désérialiser.
Il y a cependant un défaut majeur avec Parcelables.
Les colisables contiennent une tonne de code passe-partout.
Pour implémenter un Parcelable, vous devez mettre en miroir les méthodes writeToParcel() et createFromParcel() de telle sorte qu'elles lisent et écrivent dans le Parcel dans le même ordre.
En outre, un Parcelable doit définir un Parcelable.Creator CREATOR final statique public pour que l'infrastructure Android puisse exploiter le code de sérialisation.
Parceler est une bibliothèque de génération de code qui génère le code source standard Android Parcelable.
Vous n'avez plus besoin d'implémenter l'interface Parcelable, writeToParcel() ou createFromParcel() ou le public static final CREATOR.
Vous annotez simplement un POJO avec @Parcel et Parceler fait le reste.
Étant donné que Parceler utilise le processeur d'annotation Java JSR-269, il n'est pas nécessaire d'exécuter un outil manuellement pour générer le code Parcelable.
Annotez simplement votre Java Bean, compilez et vous avez terminé.
Par défaut, Parceler sérialisera directement les champs de votre instance :
Veillez à ne pas utiliser de champs privés lorsque vous utilisez la stratégie de sérialisation de champs par défaut, car cela entraînerait une pénalité de performances en raison de la réflexion.
Pour utiliser le code généré, vous pouvez référencer la classe générée directement, ou via la classe utilitaire Parcels :
Pour déréférencer le @Parcel, appelez simplement la méthode Parcels.unwrap() :
Bien sûr, le Parcelable enveloppé peut être ajouté à un bundle Android pour être transféré d'une activité à l'autre :
Et déréférencé dans la méthode onCreate() :
Cette technique d’emballage et de déballage s’accorde bien avec le modèle Intent Factory.
De plus, Parceler est pris en charge par les bibliothèques suivantes :
Transfuse - Permet d'utiliser les beans annotés @Parcel avec l'injection @Extra.
FragmentArgs - Utilise l'adaptateur ParcelerArgsBundler pour envelopper et déballer les beans annotés @Parcel avec des paramètres de fragment.
Dart - Détecte automatiquement les beans annotés @Parcel et les déballe automatiquement lors de l'utilisation de @InjectExtra.
AndroidAnnotations - Détecte automatiquement les beans annotés @Parcel et les enveloppe/déballe automatiquement lors de l'utilisation de @Extra, @FragmentArg, @InstanceState et d'autres annotations liées au Bundle.
ActivityStarter - Prend en charge nativement les objets Parceler comme arguments pour les activités, fragments, services, etc.
Remoter - Prend en charge nativement les objets Parceler comme arguments dans les interfaces @Remoter.
Types d'attributs de parcelle
Seul un nombre sélectionné de types peut être utilisé comme attributs d'une classe @Parcel.
La liste suivante inclut les types mappés :
octet
double
flotter
int
long
carboniser
booléen
Chaîne
Classeur I
Paquet
SparseArray de l'un des types mappés*
SparseBooleanArray
Champ observable
List, ArrayList et LinkedList de l'un des types mappés*
Map, HashMap, LinkedHashMap, SortedMap et TreeMap de l'un des types mappés*
Set, HashSet, SortedSet, TreeSet, LinkedHashSet de l'un des types mappés*
Parcelable
Sérialisable
Tableau de l’un des types mappés
Toute autre classe annotée avec @Parcel
*Parcel entraînera une erreur si le paramètre générique n'est pas mappé.
Parceler prend également en charge directement l’un des types ci-dessus.
Ceci est particulièrement utile lorsqu'il s'agit de collections de classes annotées avec @Parcel :
Polymorphisme
Notez que Parceler ne déballe pas les hiérarchies d'héritage, donc tous les champs polymorphes seront déballés en tant qu'instances de la classe de base.
En effet, Parceler opte pour les performances plutôt que de vérifier .getClass() pour chaque élément de données.
Reportez-vous à la section Sérialisation personnalisée pour un exemple d'utilisation de champs polymorphes.
Techniques de sérialisation
Parceler propose plusieurs choix sur la façon de sérialiser et de désérialiser un objet en plus de la sérialisation basée sur les champs vue ci-dessus.
Sérialisation getter/setter
Parceler peut être configuré pour sérialiser à l'aide de méthodes getter et setter et d'un constructeur non vide.
De plus, les champs, méthodes et paramètres de constructeur peuvent être associés à l'aide de l'annotation @ParcelProperty.
Cela prend en charge un certain nombre de stratégies de beans, notamment l'immuabilité et les beans getter/setter traditionnels.
Pour configurer la sérialisation de la méthode par défaut, configurez simplement l'annotation @Parcel avec Serialization.BEAN :
Pour utiliser un constructeur avec sérialisation, annotez le constructeur souhaité avec l'annotation @ParcelConstructor :
Si un constructeur vide est présent, Parceler utilisera ce constructeur à moins qu'un autre constructeur ne soit annoté.
Mélanger des getters/setters et des champs
Vous pouvez également mélanger et assortir les techniques de sérialisation à l'aide de l'annotation @ParcelProperty.
Dans l'exemple suivant, firstName et lastName sont écrits dans le bean à l'aide du constructeur tandis que firstName est lu à partir du bean à l'aide du champ et lastName est lu à l'aide de la méthode getLastName().
Les paramètres firstName et lastName sont respectivement coordonnés par les noms de paramètres "first" et "last".
Pour les attributs qui ne doivent pas être sérialisés avec Parceler, le champ d'attribut, getter ou setter peut être annoté par @Transient.
Parceler prend en charge de nombreux styles différents centrés sur le POJO.
Cela permet aux classes annotées @Parcel d'être utilisées avec d'autres bibliothèques basées sur POJO, notamment les suivantes :
GSON
Royaume
Placard
XML simple
DBFlow
Prise en charge de l'usine statique
Au lieu d'utiliser directement un constructeur, Parceler prend en charge l'utilisation d'une usine statique annotée pour créer une instance de la classe donnée.
Ce style prend en charge le processeur d'annotations AutoValue/la bibliothèque de génération de code de Google pour générer des beans immuables.
Parceler s'interface avec AutoValue via l'annotation @ParcelFactory, qui mappe une méthode de fabrique statique dans la sérialisation @Parcel annotée :
AutoValue génère une classe différente de celle du @Parcel annoté. Par conséquent, vous devez spécifier quelle classe Parceler doit créer dans la classe utilitaire Parcels :
Et pour désérialiser :
Sérialisation personnalisée
@Parcel inclut un paramètre facultatif pour inclure un sérialiseur manuel ParcelConverter dans le cas où une sérialisation spéciale est nécessaire.
Cela fournit une option encore plus propre pour utiliser les classes Parcelable plutôt que de les implémenter manuellement.
Le code suivant montre l'utilisation d'un ParcelConverter pour déballer la hiérarchie d'héritage pendant la désérialisation.
Parceler est également fourni avec une série de classes de base pour faciliter la conversion de collection, situées sous le package org.parceler.converter de l'API.
Ces classes de base s'occupent d'une variété de tâches difficiles ou verbeuses traitant des collections, notamment les vérifications nulles et les itérations de collecte.
Par exemple, le ParcelConverter ci-dessus pourrait être écrit en utilisant `ArrayListParcelConverter' :
Classes sans source Java
Pour les classes dont la source Java correspondante n'est pas disponible, on peut inclure la classe en tant que Parcel en utilisant l'annotation @ParcelClass.
Cette annotation peut être déclarée n'importe où dans la source compilée qui convient.
Par exemple, on pourrait inclure le @ParcelClass avec l'application Android :
Plusieurs annotations @ParcelClass peuvent être déclarées à l'aide de l'annotation @ParcelClasses.
De plus, les classes référencées par @ParcelClass peuvent être configurées à l'aide de l'annotation @Parcel.
Cela permet la configuration de la sérialisation via n'importe quel paramètre disponible sur l'annotation @Parcel, y compris la technique de sérialisation ou les classes à analyser.
Une technique utile est la possibilité de définir des convertisseurs personnalisés globaux pour un type :
Cela permet un contrôle précis sur une classe qui n'est pas disponible pour une modification directe.
Configuration avancée
Sauter l'analyse
Il est courant que certaines bibliothèques exigent qu'un bean étende une classe de base.
Bien que ce ne soit pas le cas le plus optimal, Parceler prend en charge cette pratique en permettant la configuration des classes de la hiérarchie d'héritage à analyser via le paramètre analyse :
Dans cet exemple, seuls les champs des classes One et Three seront sérialisés, évitant ainsi les paramètres de classe BaseClass et Two.
Emballage spécifique
La classe utilitaire Parcels recherche la classe donnée pour l'encapsuler par classe.
Pour des raisons de performances, cela ignore l'héritage, tant des classes super que des classes de base.
Il existe deux solutions à ce problème.
Tout d'abord, on peut spécifier des types supplémentaires à associer au type donné via le paramètre Implementations :
Deuxièmement, on peut également spécifier le type de classe lors de l'utilisation de la méthode Parcels.wrap() :
Configuration de Proguard
Pour configurer Proguard, ajoutez les lignes suivantes à votre fichier de configuration proguard. Ceux-ci conserveront les fichiers liés à la classe utilitaire Parcels et à l'instance Parcelable CREATOR :
euh
Obtenir un colis
Vous pouvez télécharger Parceler en tant que dépendance Maven :
ou Gradle :
Ou depuis Maven Central.
Licence
exemple:
Moteur de rendu Mitsuba 3
Documentation | Vidéos tutorielles | Linux | Mac OS | Fenêtres | PyPI |
---|---|---|---|---|---|
️
Avertissement
️
Il existe actuellement un grand nombre de travaux non documentés et instables en cours dans
la branche master
. Nous vous recommandons fortement d'utiliser notre
dernière version
jusqu'à nouvel ordre.
Si vous souhaitez déjà tester les modifications à venir, veuillez consulter
ce guide de portage.
Il devrait couvrir la plupart des nouvelles fonctionnalités et des modifications majeures à venir.
Introduction
Mitsuba 3 est un système de rendu orienté recherche pour la lumière directe et inverse
simulation de transport développée à l'EPFL en Suisse.
Il se compose d'une bibliothèque principale et d'un ensemble de plugins qui implémentent des fonctionnalités
allant des matériaux et sources de lumière aux algorithmes de rendu complets.
Mitsuba 3 est reciblable : cela signifie que les implémentations sous-jacentes et
les structures de données peuvent se transformer pour accomplir diverses tâches différentes. Pour
Par exemple, le même code peut simuler à la fois le transport RVB scalaire (classique un rayon à la fois)
ou transport spectral différentiel sur le GPU. Tout cela s'appuie sur
Dr.Jit, un compilateur spécialisé juste à temps (JIT) développé spécifiquement pour ce projet.
Principales caractéristiques
Multiplateforme : Mitsuba 3 a été testé sur Linux ( x86_64
), macOS
( aarch64
, x8664
) et Windows ( x8664
).
Hautes performances : le compilateur Dr.Jit sous-jacent fusionne le code de rendu
en noyaux qui atteignent des performances de pointe en utilisant
un backend LLVM ciblant le CPU et un backend CUDA/OptiX
ciblant les GPU NVIDIA avec l’accélération matérielle du lancer de rayons.
Python d'abord : Mitsuba 3 est profondément intégré à Python. Matériels,
des textures, et même des algorithmes de rendu complets peuvent être développés en Python,
que le système compile JIT (et éventuellement différencie) à la volée.
Cela permet l'expérimentation nécessaire à la recherche en infographie et
d'autres disciplines.
Différenciation : Mitsuba 3 est un moteur de rendu différenciable, ce qui signifie qu'il
peut calculer les dérivées de l'ensemble de la simulation par rapport à l'entrée
des paramètres tels que la pose de la caméra, la géométrie, les BSDF, les textures et les volumes. Il
implémente des algorithmes de rendu différenciables récents développés à l'EPFL.
Spectral & Polarisation : Mitsuba 3 peut être utilisé comme monochromatique
rendu, un rendu basé sur RVB ou un rendu spectral. Chaque variante peut
éventuellement tenir compte des effets de polarisation si vous le souhaitez.
Vidéos tutorielles, documentation
Nous avons enregistré plusieurs vidéos YouTube qui fournissent une introduction douce
Mitsuba 3 et Dr Jit. Au-delà de cela, vous pouvez trouver des cahiers Juypter complets
couvrant une variété d'applications, de guides pratiques et de documentation de référence
sur readthedocs.
Installation
Nous fournissons des roues binaires précompilées via PyPI. Installer Mitsuba de cette façon est aussi simple que d'exécuter
pip installer mitsuba
sur la ligne de commande. Le package Python comprend treize variantes par défaut :
scalar_rgb
scalar_spectral
scalarspectralpolarized
llvmadrgb
llvmadmono
llvmadmono_polarized
llvmadspectral
llvmadspectral_polarized
cudaadrgb
cudaadmono
cudaadmono_polarized
cudaadspectral
cudaadspectral_polarized
Les deux premiers effectuent une simulation classique d'un rayon à la fois en utilisant soit un RVB
ou représentation spectrale des couleurs, tandis que les deux derniers peuvent être utilisés pour l'inverse
rendu sur le CPU ou le GPU. Pour accéder à des variantes supplémentaires, vous devrez
compilez une version personnalisée de Dr.Jit à l'aide de CMake. Veuillez consulter le
documentation
pour plus de détails à ce sujet.
Exigences
Python >= 3.8
(facultatif) Pour le calcul sur le GPU : Nvidia driver >= 495.89
(facultatif) Pour le calcul vectorisé/parallèle sur le CPU : LLVM >= 11.1
Usage
Voici un exemple simple de « Hello World » qui montre à quel point il est simple de restituer un
scène utilisant Mitsuba 3 de Python :
# Importez la bibliothèque en utilisant l'alias "mi" import mitsuba as mi# Définir la variante du renderermi.setvariant('scalarrgb')# Charger une scènecene = mi.loaddict(mi.cornellbox())# Rendre la scèneimg = mi. render(scene)# Écrit l'image rendue dans un fichier EXR mi.Bitmap(img).write('cbox.exr')
Des didacticiels et des exemples de cahiers couvrant une variété d'applications peuvent être trouvés
dans la documentation.
À propos
Ce projet a été créé par Wenzel Jakob.
Des fonctionnalités et/ou améliorations importantes du code ont été apportées par
Sébastien Speierer,
Nicolas Roussel,
Merlin Nimier-David,
Délio Vicini,
Tizian Zeltner,
Baptiste Nicolet,
Miguel Crespo,
Vincent Leroy, et
Ziyi Zhang.
Lorsque vous utilisez Mitsuba 3 dans des projets académiques, veuillez citer :
@software{Mitsuba3,title = {Mitsuba 3 renderer},author = {Wenzel Jakob et Sébastien Speierer et Nicolas Roussel et Merlin Nimier-David et Delio Vicini et Tizian Zeltner et Baptiste Nicolet et Miguel Crespo et Vincent Leroy et Ziyi Zhang},note = {https://mitsuba-renderer.org},version = {3.1.1},année = 2022}