Dieses Dokument bietet einen umfassenden Überblick über Parceler, eine Codegenerierungsbibliothek für Android, die die Erstellung von Parcelable-Objekten vereinfacht. Es beschreibt detailliert die Funktionen von Parceler, einschließlich unterstützter Datentypen, Serialisierungstechniken, Umgang mit Polymorphismus und erweiterten Konfigurationen sowie der Integration mit anderen beliebten Android-Bibliotheken. Der letzte Teil stellt Mitsuba 3 vor, ein forschungsorientiertes Rendering-System, und erläutert seine Funktionen, Installation und Verwendung.
Paketzusteller
Haben Sie eine Frage? Fragen Sie es auf StackOverflow.
Haben Sie ein Problem gefunden? Bitte melden Sie es.
In Android sind Parcelables eine großartige Möglichkeit, Java-Objekte zwischen Kontexten zu serialisieren.
Im Vergleich zur herkömmlichen Serialisierung benötigt Parcelables etwa zehnmal weniger Zeit für die Serialisierung und Deserialisierung.
Es gibt jedoch einen großen Fehler bei Parcelables.
Pakete enthalten eine Menge Standardcode.
Um ein Parcelable zu implementieren, müssen Sie die Methoden writeToParcel() und createFromParcel() so spiegeln, dass sie das Parcel in derselben Reihenfolge lesen und schreiben.
Außerdem muss ein Parcelable einen öffentlichen, statischen finalen Parcelable.Creator CREATOR definieren, damit die Android-Infrastruktur den Serialisierungscode nutzen kann.
Parceler ist eine Codegenerierungsbibliothek, die den Boilerplate-Quellcode für Android Parcelable generiert.
Sie müssen nicht mehr die Parcelable-Schnittstelle, writeToParcel() oder createFromParcel() oder den öffentlichen statischen Final CREATOR implementieren.
Sie kommentieren einfach ein POJO mit @Parcel und Parceler erledigt den Rest.
Da Parceler den Java JSR-269 Annotation Processor verwendet, ist es nicht erforderlich, manuell ein Tool auszuführen, um den Parcelable-Code zu generieren.
Kommentieren Sie einfach Ihr Java Bean, kompilieren Sie es und schon sind Sie fertig.
Standardmäßig serialisiert Parceler die Felder Ihrer Instanz direkt:
Achten Sie darauf, keine privaten Felder zu verwenden, wenn Sie die Standardstrategie zur Feldserialisierung verwenden, da dies aufgrund der Reflexion zu Leistungseinbußen führt.
Um den generierten Code zu verwenden, können Sie direkt oder über die Dienstprogrammklasse „Parcels“ auf die generierte Klasse verweisen:
Um das @Parcel zu dereferenzieren, rufen Sie einfach die Methode Parcels.unwrap() auf:
Natürlich kann das verpackte Paket zu einem Android-Bundle hinzugefügt werden, um es von Aktivität zu Aktivität zu übertragen:
Und in der onCreate()-Methode dereferenziert:
Diese Ein- und Auspacktechnik passt gut zum Intent Factory-Muster.
Darüber hinaus wird Parceler von den folgenden Bibliotheken unterstützt:
Transfuse – Ermöglicht die Verwendung von @Parcel-annotierten Beans mit der @Extra-Injektion.
FragmentArgs – Verwendet den ParcelerArgsBundler-Adapter, um @Parcel-annotierte Beans mit Fragmentparametern zu verpacken und zu entpacken.
Dart – Erkennt @Parcel-annotierte Beans automatisch und entpackt sie automatisch, wenn @InjectExtra verwendet wird.
AndroidAnnotations – Erkennt mit @Parcel annotierte Beans automatisch und verpackt/entpackt sie automatisch, wenn @Extra, @FragmentArg, @InstanceState und andere Bundle-bezogene Annotationen verwendet werden.
ActivityStarter – Unterstützt native Parceler-Objekte als Argumente für Aktivitäten, Fragmente, Dienste usw.
Remoter – Unterstützt native Parceler-Objekte als Argumente in @Remoter-Schnittstellen.
Flurstücksattributtypen
Als Attribute einer @Parcel-Klasse darf nur eine ausgewählte Anzahl von Typen verwendet werden.
Die folgende Liste enthält die zugeordneten Typen:
Byte
doppelt
schweben
int
lang
verkohlen
Boolescher Wert
Zeichenfolge
IBinder
Bündeln
SparseArray eines der zugeordneten Typen*
SparseBooleanArray
ObservableField
Liste, ArrayList und LinkedList aller zugeordneten Typen*
Map, HashMap, LinkedHashMap, SortedMap und TreeMap aller zugeordneten Typen*
Set, HashSet, SortedSet, TreeSet, LinkedHashSet eines der zugeordneten Typen*
Paketversand
Serialisierbar
Array aller zugeordneten Typen
Jede andere mit @Parcel annotierte Klasse
*Parcel führt zu einem Fehler, wenn der generische Parameter nicht zugeordnet ist.
Parceler unterstützt auch alle oben genannten Typen direkt.
Dies ist besonders nützlich, wenn Sie mit Klassensammlungen arbeiten, die mit @Parcel annotiert sind:
Polymorphismus
Beachten Sie, dass Parceler Vererbungshierarchien nicht entpackt, sodass alle polymorphen Felder als Instanzen der Basisklasse entpackt werden.
Dies liegt daran, dass Parceler sich für die Leistung entscheidet, anstatt .getClass() für jedes Datenelement zu überprüfen.
Ein Beispiel für die Arbeit mit polymorphen Feldern finden Sie im Abschnitt „Benutzerdefinierte Serialisierung“.
Serialisierungstechniken
Parceler bietet zusätzlich zur oben gezeigten feldbasierten Serialisierung mehrere Möglichkeiten zum Serialisieren und Deserialisieren eines Objekts.
Getter/Setter-Serialisierung
Parceler kann für die Serialisierung mithilfe von Getter- und Setter-Methoden und einem nicht leeren Konstruktor konfiguriert werden.
Darüber hinaus können Felder, Methoden und Konstruktorparameter mithilfe der Annotation @ParcelProperty verknüpft werden.
Dies unterstützt eine Reihe von Bean-Strategien, einschließlich Unveränderlichkeit und traditionelle Getter/Setter-Beans.
Um die Serialisierung der Standardmethode zu konfigurieren, konfigurieren Sie einfach die @Parcel-Annotation mit Serialization.BEAN:
Um einen Konstruktor mit Serialisierung zu verwenden, kommentieren Sie den gewünschten Konstruktor mit der Annotation @ParcelConstructor:
Wenn ein leerer Konstruktor vorhanden ist, verwendet Parceler diesen Konstruktor, sofern kein anderer Konstruktor mit Anmerkungen versehen ist.
Getter/Setter und Felder mischen
Sie können Serialisierungstechniken auch mit der Annotation @ParcelProperty kombinieren und anpassen.
Im folgenden Beispiel werden „firstName“ und „lastName“ mithilfe des Konstruktors in die Bean geschrieben, während „firstName“ mithilfe des Felds aus der Bean gelesen wird und „lastName“ mithilfe der Methode getLastName() gelesen wird.
Die Parameter Vorname und Nachname werden jeweils durch die Parameternamen „Vorname“ und „Nachname“ koordiniert.
Für Attribute, die nicht mit Parceler serialisiert werden sollen, können das Attributfeld, der Getter oder Setter mit @Transient annotiert werden.
Parceler unterstützt viele verschiedene Stile rund um das POJO.
Dadurch können @Parcel-annotierte Klassen mit anderen POJO-basierten Bibliotheken verwendet werden, einschließlich der folgenden:
GSON
Reich
Schrank
Einfaches XML
DBFlow
Static Factory-Unterstützung
Als Alternative zur direkten Verwendung eines Konstruktors unterstützt Parceler die Verwendung einer annotierten Static Factory zum Erstellen einer Instanz der angegebenen Klasse.
Dieser Stil unterstützt den AutoValue-Annotationsprozessor/die Codegenerierungsbibliothek von Google zum Generieren unveränderlicher Beans.
Parceler ist über die Annotation @ParcelFactory mit AutoValue verbunden, die eine statische Factory-Methode der annotierten @Parcel-Serialisierung zuordnet:
AutoValue generiert eine andere Klasse als das mit Anmerkungen versehene @Parcel. Daher müssen Sie angeben, welche Klasse Parceler in der Utility-Klasse Parcels erstellen soll:
Und zum Deserialisieren:
Benutzerdefinierte Serialisierung
@Parcel enthält einen optionalen Parameter zum Einbinden eines manuellen Serialisierers ParcelConverter für den Fall, dass eine spezielle Serialisierung erforderlich ist.
Dies bietet eine noch sauberere Option für die Verwendung von Parcelable-Klassen als deren manuelle Implementierung.
Der folgende Code demonstriert die Verwendung eines ParcelConverter zum Entpacken der Vererbungshierarchie während der Deserialisierung.
Parceler ist außerdem mit einer Reihe von Basisklassen ausgestattet, die die Sammlungskonvertierung erleichtern und sich im Paket org.parceler.converter der API befinden.
Diese Basisklassen kümmern sich um eine Vielzahl schwieriger oder ausführlicher Aufgaben im Zusammenhang mit Sammlungen, einschließlich Nullprüfungen und Sammeliteration.
Der obige ParcelConverter könnte beispielsweise mit dem „ArrayListParcelConverter“ geschrieben werden:
Klassen ohne Java-Quelle
Für Klassen, deren entsprechende Java-Quelle nicht verfügbar ist, kann man die Klasse mithilfe der Annotation @ParcelClass als Parcel einschließen.
Diese Anmerkung kann an einer geeigneten Stelle in der kompilierten Quelle deklariert werden.
Beispielsweise könnte man die @ParcelClass zusammen mit der Android-Anwendung einbinden:
Mit der Annotation @ParcelClasses können mehrere @ParcelClass-Annotationen deklariert werden.
Darüber hinaus können von @ParcelClass referenzierte Klassen mithilfe der @Parcel-Annotation konfiguriert werden.
Dies ermöglicht die Serialisierungskonfiguration über jeden Parameter, der in der @Parcel-Annotation verfügbar ist, einschließlich der Serialisierungstechnik oder der zu analysierenden Klassen.
Eine nützliche Technik ist die Möglichkeit, globale benutzerdefinierte Konverter für einen Typ zu definieren:
Dies ermöglicht eine differenzierte Steuerung einer Klasse, die nicht direkt geändert werden kann.
Erweiterte Konfiguration
Analyse überspringen
Bei manchen Bibliotheken ist es üblich, eine Bean zum Erweitern einer Basisklasse zu benötigen.
Obwohl dies nicht der optimalste Fall ist, unterstützt Parceler diese Vorgehensweise, indem es die Konfiguration ermöglicht, welche Klassen in der Vererbungshierarchie über den Analyseparameter analysiert werden sollen:
In diesem Beispiel werden nur Felder der Klassen „One“ und „Three“ serialisiert, wobei sowohl die Klassenparameter „BaseClass“ als auch „Two“ vermieden werden.
Spezifische Verpackung
Die Dienstprogrammklasse „Parcels“ sucht nach der angegebenen Klasse, um sie nach Klasse zu verpacken.
Aus Leistungsgründen wird die Vererbung sowohl der Super- als auch der Basisklasse ignoriert.
Für dieses Problem gibt es zwei Lösungen.
Zunächst kann man über den Implementierungsparameter zusätzliche Typen angeben, die dem angegebenen Typ zugeordnet werden sollen:
Zweitens kann man bei Verwendung der Methode Parcels.wrap() auch den Klassentyp angeben:
Proguard konfigurieren
Um Proguard zu konfigurieren, fügen Sie die folgenden Zeilen zu Ihrer Proguard-Konfigurationsdatei hinzu. Diese speichern Dateien, die sich auf die Dienstprogrammklasse Parcels und die Instanz Parcelable CREATOR beziehen:
ähm
Paketzusteller bekommen
Sie können Parceler als Maven-Abhängigkeit herunterladen:
oder Gradle:
Oder von Maven Central.
Lizenz
Beispiel:
Mitsuba Renderer 3
Dokumentation | Tutorial-Videos | Linux | MacOS | Windows | PyPI |
---|---|---|---|---|---|
️
Warnung
️
Derzeit gibt es hier eine große Menge undokumentierter und instabiler Arbeiten
der master
. Wir empfehlen Ihnen dringend, unsere zu verwenden
neueste Version
bis auf Weiteres.
Wenn Sie die bevorstehenden Änderungen bereits ausprobieren möchten, schauen Sie sich bitte um
dieser Portierungsanleitung.
Es sollte die meisten kommenden neuen Funktionen und Breaking Changes abdecken.
Einführung
Mitsuba 3 ist ein forschungsorientiertes Rendering-System für Vorwärts- und Rückwärtslicht
Transportsimulation, entwickelt an der EPFL in der Schweiz.
Es besteht aus einer Kernbibliothek und einer Reihe von Plugins, die Funktionen implementieren
von Materialien und Lichtquellen bis hin zu kompletten Rendering-Algorithmen.
Mitsuba 3 ist retargetierbar : Das bedeutet, dass die zugrunde liegenden Implementierungen und
Datenstrukturen können sich verändern, um verschiedene Aufgaben zu erfüllen. Für
Beispielsweise kann derselbe Code beide skalaren (klassischen, jeweils einen Strahl gleichzeitig ausführenden) RGB-Transporte simulieren
oder differenzieller spektraler Transport auf der GPU. Darauf baut alles auf
Dr.Jit, ein spezialisierter Just-in-Time -Compiler (JIT), der speziell für dieses Projekt entwickelt wurde.
Hauptmerkmale
Plattformübergreifend : Mitsuba 3 wurde unter Linux ( x86_64
) und macOS getestet
( aarch64
, x8664
) und Windows ( x8664
).
Hohe Leistung : Der zugrunde liegende Dr.Jit-Compiler verschmilzt Rendering-Code
in Kernel, die modernste Leistung erzielen
ein LLVM-Backend, das auf die CPU abzielt, und ein CUDA/OptiX-Backend
zielt auf NVIDIA-GPUs mit Raytracing-Hardwarebeschleunigung ab.
Python zuerst : Mitsuba 3 ist tief in Python integriert. Materialien,
Texturen und sogar vollständige Rendering-Algorithmen können in Python entwickelt werden,
die das System im laufenden Betrieb JIT-kompiliert (und optional differenziert).
Dies ermöglicht die Experimente, die für die Forschung in der Computergrafik erforderlich sind
andere Disziplinen.
Differenzierung : Mitsuba 3 ist ein differenzierbarer Renderer, was bedeutet, dass er
kann Ableitungen der gesamten Simulation in Bezug auf die Eingabe berechnen
Parameter wie Kameraposition, Geometrie, BSDFs, Texturen und Volumina. Es
implementiert aktuelle differenzierbare Rendering-Algorithmen, die an der EPFL entwickelt wurden.
Spektral und Polarisation : Mitsuba 3 kann monochromatisch verwendet werden
Renderer, RGB-basierter Renderer oder Spektralrenderer. Jede Variante kann
Berücksichtigen Sie optional die Auswirkungen der Polarisation, falls gewünscht.
Tutorial-Videos, Dokumentation
Wir haben mehrere YouTube-Videos aufgenommen, die eine sanfte Einführung bieten
Mitsuba 3 und Dr.Jit. Darüber hinaus finden Sie komplette Juypter-Notizbücher
Es umfasst eine Vielzahl von Anwendungen, Anleitungen und Referenzdokumentationen
auf readthedocs.
Installation
Wir stellen vorkompilierte Binärräder über PyPI bereit. Mitsuba auf diese Weise zu installieren ist so einfach wie das Ausführen
pip install mitsuba
auf der Kommandozeile. Das Python-Paket enthält standardmäßig dreizehn Varianten:
scalar_rgb
scalar_spectral
scalarspectralpolarized
llvmadrgb
llvmadmono
llvmadmono_polarized
llvmadspectral
llvmadspectral_polarized
cudaadrgb
cudaadmono
cudaadmono_polarized
cudaadspectral
cudaadspectral_polarized
Die ersten beiden führen eine klassische Einzelstrahl-Simulation mit entweder einem RGB durch
oder spektrale Farbdarstellung, wobei die beiden letzteren für die Umkehrung verwendet werden können
Rendern auf der CPU oder GPU. Um auf zusätzliche Varianten zugreifen zu können, müssen Sie Folgendes tun
Kompilieren Sie eine benutzerdefinierte Version von Dr.Jit mit CMake. Bitte beachten Sie die
Dokumentation
Einzelheiten hierzu finden Sie hier.
Anforderungen
Python >= 3.8
(optional) Für Berechnung auf der GPU: Nvidia driver >= 495.89
(optional) Für vektorisierte / parallele Berechnung auf der CPU: LLVM >= 11.1
Verwendung
Hier ist ein einfaches „Hello World“-Beispiel, das zeigt, wie einfach es ist, ein zu rendern
Szene mit Mitsuba 3 aus Python:
# Importieren Sie die Bibliothek mit dem Alias „mi“import mitsuba as mi# Legen Sie die Variante des Renderers festmi.setvariant('scalarrgb')# Laden Sie eine Szenescene = mi.loaddict(mi.cornellbox())# Rendern Sie die Szeneimg = mi. render(scene)# Schreiben Sie das gerenderte Bild in eine EXR-Dateimi.Bitmap(img).write('cbox.exr')
Es stehen Tutorials und Beispiel-Notebooks für eine Vielzahl von Anwendungen zur Verfügung
in der Dokumentation.
Um
Dieses Projekt wurde von Wenzel Jakob erstellt.
Wesentliche Funktionen und/oder Verbesserungen am Code wurden von beigesteuert
Sébastien Speierer,
Nicolas Roussel,
Merlin Nimier-David,
Delio Vicini,
Tizian Zeltner,
Baptiste Nicolet,
Miguel Crespo,
Vincent Leroy und
Ziyi Zhang.
Wenn Sie Mitsuba 3 in akademischen Projekten verwenden, geben Sie bitte Folgendes an:
@software{Mitsuba3,title = {Mitsuba 3 renderer},author = {Wenzel Jakob und Sébastien Speierer und Nicolas Roussel und Merlin Nimier-David und Delio Vicini und Tizian Zeltner und Baptiste Nicolet und Miguel Crespo und Vincent Leroy und Ziyi Zhang},Anmerkung = {https://mitsuba-renderer.org},Version = {3.1.1},Jahr = 2022}