本文档全面概述了 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}