本文檔全面概述了 Parceler,這是一個 Android 程式碼產生程式庫,可簡化 Parcelable 物件的建立。它詳細介紹了 Parceler 的功能,包括支援的資料類型、序列化技術、多態性處理和高級配置,以及與其他流行 Android 庫的整合。後者介紹了Mitsuba 3,一個面向研究的渲染系統,概述了其功能、安裝和使用。
包裹商
有問題嗎?在 StackOverflow 上詢問。
發現問題?請檢舉。
在 Android 中,Parcelables 是在上下文之間序列化 Java 物件的好方法。
與傳統的序列化相比,Parcelables 的序列化和反序列化時間減少了約 10 倍。
然而,Parcelables 存在一個重大缺陷。
Parcelables 包含大量樣板程式碼。
要實作 Parcelable,您必須鏡像 writeToParcel() 和 createFromParcel() 方法,以便它們以相同的順序讀取和寫入 Parcel。
此外,Parcelable 必須定義一個公共靜態最終 Parcelable.Creator CREATOR,以便 Android 基礎設施能夠利用序列化程式碼。
Parceler 是一個程式碼產生函式庫,可產生 Android Parcelable 樣板原始碼。
您不再需要實作 Parcelable 介面、writeToParcel() 或 createFromParcel() 或 public static final CREATOR。
您只需使用 @Parcel 註釋 POJO,Parceler 就會完成剩下的工作。
由於 Parceler 使用 Java JSR-269 Annotation Processor,因此無需手動執行工具來產生 Parcelable 程式碼。
只需註釋您的 Java Bean,編譯即可完成。
預設情況下,Parceler 將直接序列化實例的欄位:
使用預設字段序列化策略時請注意不要使用私有字段,因為它會因反射而導致效能損失。
要使用產生的程式碼,您可以直接引用產生的類,或透過 Parcels 實用程式類:
要取消引用 @Parcel,只需呼叫 Parcels.unwrap() 方法:
當然,包裝好的 Parcelable 可以加入 Android Bundle 中,以便在 Activity 之間傳輸:
並在 onCreate() 方法中取消引用:
這種包裝和展開技術與意圖工廠模式配合得很好。
此外,Parceler 還受以下程式庫支援:
Transfuse - 允許@Parcel註釋的bean與@Extra注入一起使用。
FragmentArgs - 使用 ParcelerArgsBundler 適配器來包裝和解開帶有片段參數的 @Parcel 註解的 bean。
Dart - 自動偵測@Parcel註解的bean並在使用@InjectExtra時自動解開它們。
AndroidAnnotations - 自動偵測@Parcel註解的bean,並在使用@Extra、@FragmentArg、@InstanceState和其他Bundle相關註解時自動包裝/解開它們。
ActivityStarter - 支援原生 Parceler 物件作為活動、片段、服務等的參數。
Remoter - 支援原生 Parceler 物件作為 @Remoter 介面中的參數。
地塊屬性類型
只有選定數量的型別可以用作 @Parcel 類別的屬性。
以下列表包含已映射的類型:
位元組
雙倍的
漂浮
整數
長的
字元
布林值
細繩
綁定器
捆
任何映射類型的 SparseArray*
稀疏布林數組
可觀察字段
任何映射類型的 List、ArrayList 和 LinkedList*
任何映射類型的 Map、HashMap、LinkedHashMap、SortedMap 和 TreeMap*
任何映射類型的 Set、HashSet、SortedSet、TreeSet、LinkedHashSet*
可分包
可串列化
任何映射類型的數組
用@Parcel註釋的任何其他類
*如果通用參數沒有映射,Parcel會出錯。
Parceler 也直接支援上述任何類型。
這在處理用 @Parcel 註解的類別集合時特別有用:
多態性
請注意,Parceler 不會解包繼承層次結構,因此任何多型欄位都會作為基底類別的實例解包。
這是因為 Parceler 選擇效能而不是檢查每個資料的 .getClass() 。
有關使用多態欄位的範例,請參閱自訂序列化部分。
序列化技術
除了上面看到的基於字段的序列化之外,Parceler 還提供了幾種如何序列化和反序列化物件的選擇。
Getter/setter 序列化
Parceler 可以配置為使用 getter 和 setter 方法以及非空構造函數進行序列化。
此外,欄位、方法和建構子參數可以使用@ParcelProperty註解進行關聯。
這支援許多 bean 策略,包括不變性和傳統的 getter/setter bean。
要配置預設方法序列化,只需使用 Serialization.BEAN 配置 @Parcel 註解:
若要將建構函式與序列化一起使用,請使用 @ParcelConstructor 註解來註解所需的建構子:
如果存在空構造函數,Parceler 將使用該構造函數,除非註解了另一個建構函數。
混合 getter/setter 和字段
您也可以使用 @ParcelProperty 註解混合和匹配序列化技術。
在下列範例中,使用建構函式將firstName 和lastName 寫入bean,同時使用欄位從bean 讀取firstName,並使用getLastName() 方法讀取lastName。
參數firstName和lastName分別由參數名稱「first」和「last」協調。
對於不應該用 Parceler 序列化的屬性,屬性欄位、getter 或 setter 可以用@Transient 註解。
Parceler 支援以 POJO 為中心的多種不同樣式。
這允許 @Parcel 註解的類別與其他基於 POJO 的程式庫一起使用,包括以下內容:
格森
領域
櫥櫃
簡單的XML
資料庫流
靜態工廠支持
作為直接使用建構函數的替代方法,Parceler 支援使用註釋的靜態工廠來建立給定類別的實例。
這種風格支援 Google 的 AutoValue 註解處理器/程式碼產生庫,用於產生不可變的 beans。
Parceler 透過 @ParcelFactory 註解與 AutoValue 接口,該註解將靜態工廠方法映射到帶有註解的 @Parcel 序列化中:
AutoValue 產生的類別與註解的 @Parcel 不同,因此,您需要指定 Parceler 應在 Parcels 實用程式類別中建立哪個類別:
並反序列化:
自訂序列化
@Parcel 包含一個可選參數,用於在需要特殊序列化的情況下包含手動序列化器 ParcelConverter。
與手動實作相比,這為使用 Parcelable 類別提供了更清晰的選擇。
以下程式碼示範了在反序列化過程中使用 ParcelConverter 解包繼承層次結構。
Parceler也封裝了一系列基類,以便更方便地進行Collection轉換,位於api的org.parceler.converter包下。
這些基類負責處理集合的各種困難或冗長的工作,包括空檢查和收集迭代。
例如,上面的 ParcelConverter 可以使用「ArrayListParcelConverter」來編寫:
沒有 Java 來源的類
對於沒有對應 Java 來源的類,可以使用 @ParcelClass 註解將該類別包含為 Parcel。
該註釋可以在編譯來源中任何方便的地方聲明。
例如,可以將 @ParcelClass 與 Android 應用程式一起包含:
可以使用 @ParcelClasses 註解來宣告多個 @ParcelClass 註解。
此外,@ParcelClass引用的類別可以使用@Parcel註解進行設定。
這允許透過 @Parcel 註解上可用的任何參數進行序列化配置,包括要分析的序列化技術或類別。
一種有用的技術是能夠為類型定義全域自訂轉換器:
這允許對無法直接修改的類別進行細粒度控制。
進階配置
跳過分析
對於某些函式庫來說,需要 bean 來擴充基底類別是常見的做法。
儘管這不是最理想的情況,Parceler 透過允許配置繼承層次結構中的哪些類別透過分析參數進行分析來支援這種做法:
在此範例中,僅序列化「一」類和「三」類的字段,避免同時使用「基底類別」和「二」類參數。
具體包裹
Parcels 實用程式類別會尋找給定的類別以按類別包裝。
出於效能原因,這會忽略繼承,包括超類別和基底類別。
這個問題有兩種解決方案。
首先,可以透過實現參數指定與給定類型關聯的其他類型:
其次,在使用 Parcels.wrap() 方法時也可以指定類別類型:
配置混淆器
若要設定 Proguard,請將以下行新增至您的 proguard 設定檔中。這些將保留與 Parcels 實用程式類別和 Parcelable CREATOR 實例相關的檔案:
呃
取得包裹器
您可以下載 Parceler 作為 Maven 依賴項:
或搖籃:
或來自 Maven Central。
執照
例子:
三葉渲染器 3
文件 | 教學影片 | Linux | 蘋果系統 | 視窗 | 皮伊 |
---|---|---|---|---|---|
️
警告
️
目前,大量無證且不穩定的工作正在進行
master
分支。我們強烈建議您使用我們的
最新版本
直至另行通知。
如果您已經想嘗試即將發生的更改,請查看
本移植指引。
它應該涵蓋大部分新功能和即將到來的重大變化。
介紹
Mitsuba 3 是一款以研究為導向的前向光和反向光渲染系統
瑞士洛桑聯邦理工學院 (EPFL) 開發的交通模擬。
它由一個核心庫和一組實現功能的插件組成
從材質和光源到完整的渲染演算法。
Mitsuba 3 是可重定向的:這意味著底層實作和
資料結構可以轉換以完成各種不同的任務。為了
例如,相同的程式碼可以模擬標量(經典的一次一束)RGB 傳輸
或 GPU 上的差分光譜傳輸。這一切都建立在
Dr.Jit,專為此專案開發的專用即時(JIT) 編譯器。
主要特點
跨平台:Mitsuba 3 已在 Linux ( x86_64
)、macOS 上進行測試
( aarch64
、 x8664
)和 Windows ( x8664
)。
高效能:底層Dr.Jit編譯器融合渲染程式碼
進入內核,使用實現最先進的性能
針對 CPU 的 LLVM 後端和 CUDA/OptiX 後端
針對具有光線追蹤硬體加速功能的 NVIDIA GPU。
Python優先:Mitsuba 3與Python深度整合。材料,
紋理,甚至完整的渲染演算法都可以用Python開發,
系統即時編譯(並可選擇區分)。
這使得電腦圖形學研究所需的實驗成為可能
其他學科。
差異化:Mitsuba 3 是一個可微分渲染器,這表示它
可以計算整個模擬相對於輸入的導數
參數,例如相機姿態、幾何形狀、BSDF、紋理和體積。它
實作了 EPFL 最近開發的可微分渲染演算法。
光譜和偏振:Mitsuba 3 可用作單色儀
渲染器、基於 RGB 的渲染器或光譜渲染器。每個變體都可以
如果需要的話,可以選擇考慮極化的影響。
教學影片、文檔
我們錄製了幾個 YouTube 視頻,提供了溫和的介紹
三葉 3 和 Dr.Jit。除此之外,您還可以找到完整的 Juypter 筆記本
涵蓋各種應用程式、操作指南和參考文檔
閱讀文檔。
安裝
我們透過 PyPI 提供預編譯的二進位輪。以這種方式安裝三葉就像運行一樣簡單
pip安裝三葉
在命令列上。 Python 套件預設包含 13 個變體:
scalar_rgb
scalar_spectral
scalarspectralpolarized
llvmadrgb
llvmadmono
llvmadmono_polarized
llvmadspectral
llvmadspectral_polarized
cudaadrgb
cudaadmono
cudaadmono_polarized
cudaadspectral
cudaadspectral_polarized
前兩個使用 RGB 執行經典的一次一光模擬
或光譜顏色表示,而後兩者可用於反演
在 CPU 或 GPU 上渲染。要存取其他變體,您需要
使用 CMake 編譯 Dr.Jit 的自訂版本。請參閱
文件
有關詳細資訊。
要求
Python >= 3.8
(可選)對於 GPU 上的計算: Nvidia driver >= 495.89
(可選)對於 CPU 上的向量化/平行計算: LLVM >= 11.1
用法
這是一個簡單的「Hello World」範例,展示了渲染一個
使用 Python 中的 Mitsuba 3 的場景:
# 使用別名「mi」導入庫 import mitsuba as mi# 設定渲染器的變體mi.setvariant('scalarrgb')# 載入場景scene = mi.loaddict(mi.cornellbox())# 渲染場景img = mi. render (scene)# 將渲染影像寫入EXR檔案mi.Bitmap(img).write('cbox.exr')
可以找到涵蓋各種應用程式的教學和範例筆記本
在文檔中。
關於
該專案由 Wenzel Jakob 創建。
程式碼的重要功能和/或改進由以下人員貢獻
賽巴斯蒂安·施派爾,
尼古拉斯·羅塞爾,
梅林·尼米爾-大衛,
德里奧·維西尼,
蒂齊安·澤爾特納,
巴蒂斯特·尼科萊特,
米格爾·克雷斯波,
文森·勒羅伊,和
張子怡.
在學術課程中使用 Mitsuba 3 時,請引用:
@software{Mitsuba3,標題= {Mitsuba 3 渲染器},作者= {Wenzel Jakob 和Sébastien Speierer 和Nicolas Roussel 和Merlin Nimier-David 和Delio Vicini 和Tizian Zeltner 和Baptiste Nicolet 和Miguel Crespo 和Vincent Leroy 和Ziyi Zhu},註= {https://mitsuba-renderer.org},版本 = {3.1.1},年份 = 2022}