Dokumen ini memberikan ikhtisar komprehensif tentang Parceler, pustaka pembuatan kode untuk Android yang menyederhanakan pembuatan objek Parcelable. Ini merinci fitur Parceler, termasuk tipe data yang didukung, teknik serialisasi, penanganan polimorfisme, dan konfigurasi lanjutan, serta integrasi dengan perpustakaan Android populer lainnya. Bagian terakhir memperkenalkan Mitsuba 3, sistem rendering berorientasi penelitian, menguraikan fitur, instalasi, dan penggunaannya.
Parceler
Punya pertanyaan? Tanyakan di StackOverflow.
Menemukan masalah? Silakan laporkan.
Di Android, Parcelables adalah cara terbaik untuk membuat serialisasi Objek Java antar Konteks.
Dibandingkan dengan Serialisasi tradisional, Parcelables membutuhkan waktu 10x lebih sedikit untuk membuat serialisasi dan deserialisasi.
Namun, ada kelemahan besar pada Parcelables.
Parcelable berisi banyak sekali kode boilerplate.
Untuk mengimplementasikan Parcelable, Anda harus mencerminkan metode writeToParcel() dan createFromParcel() sedemikian rupa sehingga keduanya membaca dan menulis ke Parcel dalam urutan yang sama.
Selain itu, Parcelable harus mendefinisikan Parcelable final statis publik.Creator CREATOR agar infrastruktur Android dapat memanfaatkan kode serialisasi.
Parceler adalah pustaka pembuatan kode yang menghasilkan kode sumber boilerplate Android Parcelable.
Anda tidak lagi harus mengimplementasikan antarmuka Parcelable, writeToParcel() atau createFromParcel() atau CREATOR final statis publik.
Anda cukup membubuhi keterangan POJO dengan @Parcel dan Parceler akan melakukan sisanya.
Karena Parceler menggunakan Prosesor Anotasi Java JSR-269, tidak perlu menjalankan alat secara manual untuk menghasilkan kode Parcelable.
Cukup beri anotasi pada Java Bean Anda, kompilasi dan Anda selesai.
Secara default, Parceler akan membuat serialisasi kolom instance Anda secara langsung:
Berhati-hatilah untuk tidak menggunakan kolom pribadi saat menggunakan strategi serialisasi kolom default karena akan menimbulkan penalti kinerja karena refleksi.
Untuk menggunakan kode yang dihasilkan, Anda dapat mereferensikan kelas yang dihasilkan secara langsung, atau melalui kelas utilitas Parcels:
Untuk melakukan dereferensi @Parcel, panggil saja metode Parcels.unwrap():
Tentu saja, Parcelable yang dibungkus dapat ditambahkan ke Android Bundle untuk ditransfer dari Aktivitas ke Aktivitas:
Dan direferensikan dalam metode onCreate():
Teknik membungkus dan membuka bungkus ini cocok dengan pola Intent Factory.
Selain itu, Parceler didukung oleh perpustakaan berikut:
Transfuse - Mengizinkan kacang beranotasi @Parcel digunakan dengan injeksi @Extra.
FragmentArgs - Menggunakan adaptor ParcelerArgsBundler untuk membungkus dan membuka bungkus kacang beranotasi @Parcel dengan parameter fragmen.
Dart - Deteksi otomatis kacang beranotasi @Parcel dan secara otomatis membuka bungkusnya saat menggunakan @InjectExtra.
AndroidAnnotations - Deteksi otomatis kacang beranotasi @Parcel dan otomatis membungkus/membukanya saat menggunakan @Extra, @FragmentArg, @InstanceState, dan anotasi terkait Bundel lainnya.
ActivityStarter - Mendukung objek Parceler asli sebagai argumen untuk Aktivitas, Fragmen, Layanan, dll.
Remoter - Mendukung objek Parceler asli sebagai argumen di antarmuka @Remoter.
Jenis atribut parsel
Hanya sejumlah tipe tertentu yang dapat digunakan sebagai atribut kelas @Parcel.
Daftar berikut mencakup tipe yang dipetakan:
byte
dobel
mengambang
ke dalam
panjang
arang
boolean
Rangkaian
Pengikat I
Bundel
SparseArray dari semua jenis yang dipetakan*
SparseBooleanArray
Bidang yang Dapat Diamati
Daftar, ArrayList, dan LinkedList dari jenis apa pun yang dipetakan*
Peta, HashMap, LinkedHashMap, SortedMap, dan TreeMap dari jenis apa pun yang dipetakan*
Set, HashSet, SortedSet, TreeSet, LinkedHashSet dari semua jenis yang dipetakan*
Dapat dipaketkan
Dapat diserialkan
Array dari salah satu tipe yang dipetakan
Kelas lain mana pun yang dianotasi dengan @Parcel
*Parcel akan error jika parameter generik tidak dipetakan.
Parceler juga mendukung semua jenis di atas secara langsung.
Hal ini sangat berguna ketika berhadapan dengan koleksi kelas yang dianotasi dengan @Parcel:
Polimorfisme
Perhatikan bahwa Parceler tidak membuka bungkusan hierarki warisan, sehingga bidang polimorfik apa pun akan dibuka bungkusnya sebagai instance kelas dasar.
Hal ini karena Parceler memilih performa dibandingkan memeriksa .getClass() untuk setiap bagian data.
Lihat bagian Serialisasi Kustom untuk contoh bekerja dengan bidang polimorfik.
Teknik serialisasi
Parceler menawarkan beberapa pilihan cara membuat serialisasi dan deserialisasi suatu objek selain serialisasi berbasis bidang yang terlihat di atas.
Serialisasi pengambil/penyetel
Parceler dapat dikonfigurasi untuk membuat serialisasi menggunakan metode pengambil dan penyetel serta konstruktor yang tidak kosong.
Selain itu, bidang, metode, dan parameter konstruktor dapat dikaitkan menggunakan anotasi @ParcelProperty.
Hal ini mendukung sejumlah strategi kacang termasuk kekekalan dan kacang pengambil/penyetel tradisional.
Untuk mengonfigurasi serialisasi metode default, cukup konfigurasikan anotasi @Parcel dengan Serialization.BEAN:
Untuk menggunakan konstruktor dengan serialisasi, beri anotasi pada konstruktor yang diinginkan dengan anotasi @ParcelConstructor:
Jika ada konstruktor kosong, Parceler akan menggunakan konstruktor tersebut kecuali konstruktor lain diberi anotasi.
Mencampur getter/setter dan field
Anda juga dapat memadupadankan teknik serialisasi menggunakan anotasi @ParcelProperty.
Dalam contoh berikut, FirstName dan LastName ditulis ke bean menggunakan konstruktor sementara firstName dibaca dari bean menggunakan field dan lastName dibaca menggunakan metode getLastName().
Parameter firstName dan lastName dikoordinasikan dengan nama parameter "first" dan "last" secara hormat.
Untuk atribut yang tidak boleh diserialkan dengan Parceler, bidang atribut, pengambil, atau penyetel dapat dianotasi dengan @Transient.
Parceler mendukung banyak gaya berbeda yang berpusat di sekitar POJO.
Hal ini memungkinkan kelas beranotasi @Parcel untuk digunakan dengan perpustakaan berbasis POJO lainnya, termasuk yang berikut:
GSON
Dunia
Lemari
XML sederhana
Aliran DB
Dukungan Pabrik Statis
Sebagai alternatif untuk menggunakan konstruktor secara langsung, Parceler mendukung penggunaan Static Factory yang diberi anotasi untuk membangun sebuah instance dari kelas tertentu.
Gaya ini mendukung pemroses anotasi AutoValue/pustaka pembuatan kode Google untuk menghasilkan kacang yang tidak dapat diubah.
Parceler berinteraksi dengan AutoValue melalui anotasi @ParcelFactory, yang memetakan metode pabrik statis ke dalam serialisasi @Parcel yang dianotasi:
AutoValue menghasilkan kelas yang berbeda dari @Parcel yang dianotasi, oleh karena itu, Anda perlu menentukan kelas Parceler mana yang harus dibangun di kelas utilitas Parcels:
Dan untuk melakukan deserialisasi:
Serialisasi khusus
@Parcel menyertakan parameter opsional untuk menyertakan serializer manual ParcelConverter jika serialisasi khusus diperlukan.
Ini memberikan opsi yang lebih bersih untuk menggunakan kelas Parcelable dibandingkan menerapkannya secara manual.
Kode berikut menunjukkan penggunaan ParcelConverter untuk membuka hierarki warisan selama deserialisasi.
Parceler juga dikemas dengan serangkaian kelas dasar untuk membuat konversi Koleksi lebih mudah terletak di bawah paket api org.parceler.converter.
Kelas dasar ini menangani berbagai pekerjaan sulit atau bertele-tele yang berhubungan dengan Koleksi termasuk pemeriksaan nol dan iterasi koleksi.
Misalnya, ParcelConverter di atas dapat ditulis menggunakan `ArrayListParcelConverter':
Kelas tanpa sumber Java
Untuk kelas yang sumber Java terkaitnya tidak tersedia, seseorang dapat menyertakan kelas tersebut sebagai Parcel dengan menggunakan anotasi @ParcelClass.
Anotasi ini dapat dideklarasikan di mana saja dalam sumber yang dikompilasi sesuai keinginan.
Misalnya, seseorang dapat menyertakan @ParcelClass bersama dengan Aplikasi Android:
Beberapa anotasi @ParcelClass dapat dideklarasikan menggunakan anotasi @ParcelClasses.
Selain itu, kelas yang direferensikan oleh @ParcelClass dapat dikonfigurasi menggunakan anotasi @Parcel.
Hal ini memungkinkan konfigurasi serialisasi melalui parameter apa pun yang tersedia di anotasi @Parcel termasuk teknik serialisasi atau kelas yang akan dianalisis.
Salah satu teknik yang berguna adalah kemampuan untuk menentukan konverter khusus global untuk suatu jenis:
Hal ini memungkinkan kontrol menyeluruh atas kelas yang tidak tersedia untuk modifikasi langsung.
Konfigurasi lanjutan
Melewatkan analisis
Merupakan praktik umum bagi beberapa perpustakaan untuk memerlukan kacang untuk memperluas kelas dasar.
Meskipun ini bukan kasus yang paling optimal, Parceler mendukung praktik ini dengan mengizinkan konfigurasi kelas mana dalam hierarki pewarisan yang akan dianalisis melalui parameter analisis:
Dalam contoh ini, hanya bidang kelas Satu dan Tiga yang akan diserialkan, menghindari parameter kelas BaseClass dan Dua.
Pembungkus khusus
Kelas utilitas Parcels mencari kelas tertentu untuk dibungkus berdasarkan kelas.
Untuk alasan kinerja, hal ini mengabaikan warisan, baik kelas super maupun kelas dasar.
Ada dua solusi untuk masalah ini.
Pertama, seseorang dapat menentukan tipe tambahan untuk dikaitkan dengan tipe tertentu melalui parameter implementasi:
Kedua, seseorang juga dapat menentukan tipe kelas saat menggunakan metode Parcels.wrap():
Mengonfigurasi Proguard
Untuk mengonfigurasi Proguard, tambahkan baris berikut ke file konfigurasi proguard Anda. Ini akan menyimpan file yang terkait dengan kelas utilitas Parcels dan instance Parcelable CREATOR:
eh
Mendapatkan Parceler
Anda dapat mengunduh Parceler sebagai ketergantungan Maven:
atau Gradle:
Atau dari Maven Central.
Lisensi
contoh:
Penyaji Mitsuba 3
Dokumentasi | Video tutorial | Linux | macOS | jendela | PyPI |
---|---|---|---|---|---|
️
Peringatan
️
Saat ini terdapat sejumlah besar pekerjaan tidak terdokumentasi dan tidak stabil yang terjadi
cabang master
. Kami sangat menyarankan Anda menggunakan kami
rilis terbaru
sampai pemberitahuan lebih lanjut.
Jika Anda sudah ingin mencoba perubahan yang akan datang, silakan lihat
panduan porting ini.
Ini harus mencakup sebagian besar fitur baru dan perubahan penting yang akan datang.
Perkenalan
Mitsuba 3 adalah sistem rendering berorientasi penelitian untuk cahaya maju dan mundur
simulasi transportasi dikembangkan di EPFL di Swiss.
Ini terdiri dari perpustakaan inti dan satu set plugin yang mengimplementasikan fungsionalitas
mulai dari bahan dan sumber cahaya hingga algoritma rendering lengkap.
Mitsuba 3 dapat ditargetkan ulang : ini berarti implementasi yang mendasarinya dan
struktur data dapat bertransformasi untuk menyelesaikan berbagai tugas berbeda. Untuk
Misalnya, kode yang sama dapat mensimulasikan transpor RGB skalar (klasik satu sinar pada satu waktu).
atau transportasi spektral diferensial pada GPU. Ini semua didasarkan pada
Dr.Jit, kompiler just-in-time (JIT) khusus yang dikembangkan khusus untuk proyek ini.
Fitur Utama
Lintas platform : Mitsuba 3 telah diuji di Linux ( x86_64
), macOS
( aarch64
, x8664
), dan Windows ( x8664
).
Performa tinggi : Kompiler Dr.Jit yang mendasari menggabungkan kode rendering
menjadi kernel yang mencapai kinerja canggih dengan menggunakan
backend LLVM yang menargetkan CPU dan backend CUDA/OptiX
menargetkan GPU NVIDIA dengan akselerasi perangkat keras ray tracing.
Python pertama : Mitsuba 3 sangat terintegrasi dengan Python. Bahan,
tekstur, dan bahkan algoritma rendering penuh dapat dikembangkan dengan Python,
yang dikompilasi oleh sistem JIT (dan secara opsional dibedakan) dengan cepat.
Hal ini memungkinkan eksperimen yang diperlukan untuk penelitian dalam grafik komputer dan
disiplin ilmu lainnya.
Diferensiasi : Mitsuba 3 adalah penyaji yang dapat dibedakan, artinya itu
dapat menghitung turunan dari keseluruhan simulasi sehubungan dengan masukan
parameter seperti pose kamera, geometri, BSDF, tekstur, dan volume. Dia
mengimplementasikan algoritma rendering terdiferensiasi terbaru yang dikembangkan di EPFL.
Spektral & Polarisasi : Mitsuba 3 dapat digunakan sebagai monokromatik
penyaji, penyaji berbasis RGB, atau penyaji spektral. Setiap varian bisa
secara opsional memperhitungkan efek polarisasi jika diinginkan.
Video tutorial, dokumentasi
Kami telah merekam beberapa video YouTube yang memberikan pengenalan lembut
Mitsuba 3 dan Dr.Jit. Selain itu, Anda dapat menemukan buku catatan Juypter lengkap
mencakup berbagai aplikasi, panduan cara kerja, dan dokumentasi referensi
di readthedocs.
Instalasi
Kami menyediakan roda biner yang telah dikompilasi sebelumnya melalui PyPI. Menginstal Mitsuba dengan cara ini semudah menjalankannya
pip instal mitsuba
pada baris perintah. Paket Python mencakup tiga belas varian secara default:
scalar_rgb
scalar_spectral
scalarspectralpolarized
llvmadrgb
llvmadmono
llvmadmono_polarized
llvmadspectral
llvmadspectral_polarized
cudaadrgb
cudaadmono
cudaadmono_polarized
cudaadspectral
cudaadspectral_polarized
Dua yang pertama melakukan simulasi klasik satu sinar pada satu waktu menggunakan RGB
atau representasi warna spektral, sedangkan dua yang terakhir dapat digunakan untuk invers
rendering pada CPU atau GPU. Untuk mengakses varian tambahan, Anda perlu melakukannya
kompilasi versi khusus Dr.Jit menggunakan CMake. Silakan lihat
dokumentasi
untuk rincian tentang ini.
Persyaratan
Python >= 3.8
(opsional) Untuk komputasi pada GPU: Nvidia driver >= 495.89
(opsional) Untuk komputasi vektor/paralel pada CPU: LLVM >= 11.1
Penggunaan
Berikut adalah contoh sederhana "Hello World" yang menunjukkan betapa sederhananya merender a
adegan menggunakan Mitsuba 3 dari Python:
# Impor perpustakaan menggunakan alias "mi"impor mitsuba sebagai mi# Atur varian renderermi.setvariant('scalarrgb')# Muat scene = mi.loaddict(mi.cornellbox())# Render sceneimg = mi. render(adegan)# Tulis gambar yang dirender ke file EXRmi.Bitmap(img).write('cbox.exr')
Tutorial dan contoh buku catatan yang mencakup berbagai aplikasi dapat ditemukan
dalam dokumentasi.
Tentang
Proyek ini dibuat oleh Wenzel Jakob.
Fitur-fitur penting dan/atau perbaikan pada kode disumbangkan oleh
Sébastien Speierer,
Nicolas Roussel,
Merlin Nimier-David,
Delio Vicini,
Tizian Zeltner,
Baptiste Nicolet,
Miguel Crespo,
Vincent Leroy, dan
Ziyi Zhang.
Saat menggunakan Mitsuba 3 dalam proyek akademik, harap kutip:
@software{Mitsuba3,title = {Mitsuba 3 renderer},author = {Wenzel Jakob dan Sébastien Speierer dan Nicolas Roussel dan Merlin Nimier-David dan Delio Vicini dan Tizian Zeltner dan Baptiste Nicolet dan Miguel Crespo dan Vincent Leroy dan Ziyi Zhang},catatan = {https://mitsuba-renderer.org},versi = {3.1.1},tahun = 2022}