Este documento proporciona una descripción general completa de Parceler, una biblioteca de generación de código para Android que simplifica la creación de objetos Parcelable. Detalla las características de Parceler, incluidos los tipos de datos admitidos, técnicas de serialización, manejo de polimorfismo y configuraciones avanzadas, junto con la integración con otras bibliotecas populares de Android. La última parte presenta Mitsuba 3, un sistema de renderizado orientado a la investigación, y describe sus características, instalación y uso.
Parcelador
¿Tiene alguna pregunta? Pregúntelo en StackOverflow.
¿Encontraste un problema? Por favor repórtelo.
En Android, Parcelables son una excelente manera de serializar objetos Java entre contextos.
En comparación con la serialización tradicional, Parcelables requiere aproximadamente 10 veces menos tiempo para serializar y deserializar.
Sin embargo, Parcelables tiene un defecto importante.
Los parcelables contienen una tonelada de código repetitivo.
Para implementar un Parcelable, debe reflejar los métodos writeToParcel() y createFromParcel() de manera que lean y escriban en el Parcel en el mismo orden.
Además, un Parcelable debe definir un Parcelable.Creator CREATOR final estático público para que la infraestructura de Android pueda aprovechar el código de serialización.
Parceler es una biblioteca de generación de código que genera el código fuente repetitivo de Android Parcelable.
Ya no es necesario implementar la interfaz Parcelable, writeToParcel() o createFromParcel() o el CREATOR final estático público.
Simplemente anota un POJO con @Parcel y Parceler hace el resto.
Debido a que Parceler utiliza el procesador de anotaciones Java JSR-269, no es necesario ejecutar una herramienta manualmente para generar el código Parcelable.
Simplemente anota tu Java Bean, compila y listo.
De forma predeterminada, Parceler serializará los campos de su instancia directamente:
Tenga cuidado de no utilizar campos privados cuando utilice la estrategia de serialización de campos predeterminada, ya que incurrirá en una penalización de rendimiento debido a la reflexión.
Para utilizar el código generado, puede hacer referencia a la clase generada directamente o mediante la clase de utilidad Parcels:
Para eliminar la referencia a @Parcel, simplemente llame al método Parcels.unwrap():
Por supuesto, el Parcelable empaquetado se puede agregar a un paquete de Android para transferirlo de una actividad a otra:
Y desreferenciado en el método onCreate():
Esta técnica de envolver y desenvolver combina bien con el patrón Intent Factory.
Además, Parceler es compatible con las siguientes bibliotecas:
Transfuse: permite utilizar beans anotados con @Parcel con la inyección @Extra.
FragmentArgs: utiliza el adaptador ParcelerArgsBundler para envolver y desenvolver beans anotados @Parcel con parámetros de fragmento.
Dart: detecta automáticamente los beans anotados con @Parcel y los desenvuelve automáticamente cuando se usa @InjectExtra.
AndroidAnnotations: detecta automáticamente los beans anotados con @Parcel y los envuelve/desenvuelve automáticamente cuando se utilizan @Extra, @FragmentArg, @InstanceState y otras anotaciones relacionadas con Bundle.
ActivityStarter: admite de forma nativa objetos Parceler como argumentos para actividades, fragmentos, servicios, etc.
Remoter: admite de forma nativa objetos Parceler como argumentos en interfaces @Remoter.
Tipos de atributos de parcela
Solo se puede utilizar un número selecto de tipos como atributos de una clase @Parcel.
La siguiente lista incluye los tipos asignados:
byte
doble
flotar
entero
largo
carbonizarse
booleano
Cadena
Carpeta
Manojo
SparseArray de cualquiera de los tipos mapeados*
Matriz booleana dispersa
Campo observable
List, ArrayList y LinkedList de cualquiera de los tipos mapeados*
Map, HashMap, LinkedHashMap, SortedMap y TreeMap de cualquiera de los tipos mapeados*
Set, HashSet, SortedSet, TreeSet, LinkedHashSet de cualquiera de los tipos mapeados*
Parcelable
Serializable
Matriz de cualquiera de los tipos mapeados
Cualquier otra clase anotada con @Parcel
*El paquete generará un error si el parámetro genérico no está asignado.
Parceler también admite directamente cualquiera de los tipos anteriores.
Esto es especialmente útil cuando se trata de colecciones de clases anotadas con @Parcel:
Polimorfismo
Tenga en cuenta que Parceler no desempaqueta las jerarquías de herencia, por lo que cualquier campo polimórfico se desempaquetará como instancias de la clase base.
Esto se debe a que Parceler opta por el rendimiento en lugar de verificar .getClass() para cada dato.
Consulte la sección Serialización personalizada para ver un ejemplo de cómo trabajar con campos polimórficos.
Técnicas de serialización
Parceler ofrece varias opciones sobre cómo serializar y deserializar un objeto además de la serialización basada en campos que se ve arriba.
Serialización getter/setter
Parceler se puede configurar para serializar utilizando métodos getter y setter y un constructor no vacío.
Además, los campos, métodos y parámetros del constructor se pueden asociar mediante la anotación @ParcelProperty.
Esto admite una serie de estrategias de beans, incluida la inmutabilidad y los beans getter/setter tradicionales.
Para configurar la serialización del método predeterminado, simplemente configure la anotación @Parcel con Serialization.BEAN:
Para utilizar un constructor con serialización, anote el constructor deseado con la anotación @ParcelConstructor:
Si hay un constructor vacío, Parceler usará ese constructor a menos que se anote otro constructor.
Mezclar captadores/definidores y campos
También puede mezclar y combinar técnicas de serialización utilizando la anotación @ParcelProperty.
En el siguiente ejemplo, nombre y apellido se escriben en el bean usando el constructor, mientras que nombre se lee del bean usando el campo y apellido se lee usando el método getLastName().
Los parámetros nombre y apellido están coordinados por los nombres de parámetro "primero" y "apellido" respectivamente.
Para los atributos que no deben serializarse con Parceler, @Transient puede anotar el campo de atributo, el captador o el definidor.
Parceler admite muchos estilos diferentes centrados en POJO.
Esto permite que las clases anotadas @Parcel se utilicen con otras bibliotecas basadas en POJO, incluidas las siguientes:
GSON
Reino
Armario
XML sencillo
DBFlow
Soporte de fábrica estática
Como alternativa al uso directo de un constructor, Parceler admite el uso de una fábrica estática anotada para crear una instancia de la clase dada.
Este estilo es compatible con el procesador de anotaciones AutoValue/biblioteca de generación de código de Google para generar beans inmutables.
Parceler interactúa con AutoValue a través de la anotación @ParcelFactory, que asigna un método de fábrica estático a la serialización @Parcel anotada:
AutoValue genera una clase diferente a la @Parcel anotada, por lo tanto, debe especificar qué clase debe compilar Parceler en la clase de utilidad Parcels:
Y para deserializar:
Serialización personalizada
@Parcel incluye un parámetro opcional para incluir un ParcelConverter serializador manual para el caso en que sea necesaria una serialización especial.
Esto proporciona una opción aún más limpia para usar clases Parcelable que implementarlas manualmente.
El siguiente código demuestra el uso de ParcelConverter para desencapsular la jerarquía de herencia durante la deserialización.
Parceler también incluye una serie de clases base para facilitar la conversión de la colección, ubicadas en el paquete org.parceler.converter de la API.
Estas clases base se encargan de una variedad de trabajos difíciles o detallados relacionados con colecciones, incluidas comprobaciones nulas e iteraciones de colecciones.
Por ejemplo, el ParcelConverter anterior podría escribirse usando `ArrayListParcelConverter':
Clases sin fuente Java
Para las clases cuya fuente Java correspondiente no está disponible, se puede incluir la clase como Parcel utilizando la anotación @ParcelClass.
Esta anotación puede declararse en cualquier lugar de la fuente compilada que sea conveniente.
Por ejemplo, se podría incluir @ParcelClass junto con la aplicación de Android:
Se pueden declarar varias anotaciones @ParcelClass utilizando la anotación @ParcelClasses.
Además, las clases a las que hace referencia @ParcelClass se pueden configurar utilizando la anotación @Parcel.
Esto permite la configuración de serialización a través de cualquier parámetro disponible en la anotación @Parcel incluyendo la técnica de serialización o clases a analizar.
Una técnica útil es la capacidad de definir convertidores personalizados globales para un tipo:
Esto permite un control detallado sobre una clase que no está disponible para modificación directa.
Configuración avanzada
Saltarse el análisis
Es una práctica común que algunas bibliotecas requieran un bean para extender una clase base.
Aunque no es el caso más óptimo, Parceler admite esta práctica al permitir la configuración de qué clases en la jerarquía de herencia analizar mediante el parámetro de análisis:
En este ejemplo, solo se serializarán los campos de las clases Uno y Tres, evitando los parámetros de clase BaseClass y Dos.
Envoltorio específico
La clase de utilidad Parcels busca la clase dada para empaquetarla por clase.
Por razones de rendimiento, esto ignora la herencia, tanto de las clases base como de las superclases.
Hay dos soluciones a este problema.
Primero, se pueden especificar tipos adicionales para asociar al tipo dado mediante el parámetro de implementaciones:
En segundo lugar, también se puede especificar el tipo de clase cuando se utiliza el método Parcels.wrap():
Configurando Proguard
Para configurar Proguard, agregue las siguientes líneas a su archivo de configuración de proguard. Estos mantendrán los archivos relacionados con la clase de utilidad Parcels y la instancia de Parcelable CREATOR:
ejem
Conseguir paqueter
Puede descargar Parceler como una dependencia de Maven:
o Gradle:
O desde Maven Central.
Licencia
ejemplo:
Renderizador Mitsuba 3
Documentación | Vídeos tutoriales | linux | Mac OS | ventanas | PyPI |
---|---|---|---|---|---|
️
Advertencia
️
Actualmente hay una gran cantidad de trabajo indocumentado e inestable en
la rama master
. Le recomendamos encarecidamente que utilice nuestro
último lanzamiento
hasta nuevo aviso.
Si ya desea probar los próximos cambios, eche un vistazo a
esta guía de portabilidad.
Debería cubrir la mayoría de las nuevas funciones y los cambios importantes que se avecinan.
Introducción
Mitsuba 3 es un sistema de renderizado de luz directa e inversa orientado a la investigación
Simulación de transporte desarrollada en EPFL en Suiza.
Consiste en una biblioteca central y un conjunto de complementos que implementan funciones.
que van desde materiales y fuentes de luz hasta algoritmos de renderizado completos.
Mitsuba 3 es reorientable : esto significa que las implementaciones subyacentes y
Las estructuras de datos pueden transformarse para realizar varias tareas diferentes. Para
Por ejemplo, el mismo código puede simular transporte RGB escalar (clásico de un rayo a la vez)
o transporte espectral diferencial en la GPU. Todo esto se basa en
Dr.Jit, un compilador especializado justo a tiempo (JIT) desarrollado específicamente para este proyecto.
Características principales
Multiplataforma : Mitsuba 3 ha sido probado en Linux ( x86_64
), macOS
( aarch64
, x8664
) y Windows ( x8664
).
Alto rendimiento : el compilador Dr.Jit subyacente fusiona el código de renderizado
en núcleos que logran un rendimiento de última generación utilizando
un backend LLVM dirigido a la CPU y un backend CUDA/OptiX
dirigido a GPU NVIDIA con aceleración de hardware de trazado de rayos.
Python primero : Mitsuba 3 está profundamente integrado con Python. materiales,
Se pueden desarrollar texturas e incluso algoritmos de renderizado completos en Python.
que el sistema compila JIT (y opcionalmente diferencia) sobre la marcha.
Esto permite la experimentación necesaria para la investigación en gráficos por ordenador y
otras disciplinas.
Diferenciación : Mitsuba 3 es un renderizador diferenciable, lo que significa que
Puede calcular derivadas de toda la simulación con respecto a la entrada.
parámetros como la pose de la cámara, la geometría, los BSDF, las texturas y los volúmenes. Él
implementa algoritmos de representación diferenciables recientes desarrollados en EPFL.
Espectral y polarización : Mitsuba 3 se puede utilizar como monocromático
renderizador, renderizador basado en RGB o renderizador espectral. Cada variante puede
Opcionalmente, tenga en cuenta los efectos de la polarización si se desea.
Vídeos tutoriales, documentación.
Hemos grabado varios vídeos de YouTube que proporcionan una suave introducción.
Mitsuba 3 y Dr.Jit. Más allá de esto puedes encontrar cuadernos Juypter completos.
que cubre una variedad de aplicaciones, guías prácticas y documentación de referencia
en readthedocs.
Instalación
Proporcionamos ruedas binarias precompiladas a través de PyPI. Instalar Mitsuba de esta manera es tan sencillo como ejecutar
instalar pip mitsuba
en la línea de comando. El paquete Python incluye trece variantes por defecto:
scalar_rgb
scalar_spectral
scalarspectralpolarized
llvmadrgb
llvmadmono
llvmadmono_polarized
llvmadspectral
llvmadspectral_polarized
cudaadrgb
cudaadmono
cudaadmono_polarized
cudaadspectral
cudaadspectral_polarized
Los dos primeros realizan la simulación clásica de un rayo a la vez usando un RGB
o representación de color espectral, mientras que los dos últimos se pueden utilizar para representación inversa.
renderizado en la CPU o GPU. Para acceder a variantes adicionales, deberá
compilar una versión personalizada de Dr.Jit usando CMake. Por favor vea el
documentación
para obtener detalles sobre esto.
Requisitos
Python >= 3.8
(opcional) Para cálculo en la GPU: Nvidia driver >= 495.89
(opcional) Para cálculo vectorizado/paralelo en la CPU: LLVM >= 11.1
Uso
A continuación se muestra un ejemplo sencillo de "Hola mundo" que muestra lo sencillo que es representar un
escena usando Mitsuba 3 de Python:
# Importar la biblioteca usando el alias "mi" importar mitsuba como mi # Establecer la variante de renderermi.setvariant('scalarrgb')# Cargar una escena = mi.loaddict(mi.cornellbox())# Renderizar la escenaimg = mi. render(scene)# Escribe la imagen renderizada en un archivo EXRmi.Bitmap(img).write('cbox.exr')
Se pueden encontrar tutoriales y cuadernos de ejemplo que cubren una variedad de aplicaciones.
en la documentación.
Acerca de
Este proyecto fue creado por Wenzel Jakob.
Funciones y/o mejoras significativas al código fueron aportadas por
Sébastien Speierer,
Nicolás Roussel,
Merlín Nimier-David,
Delio Vicini,
Tizian Zeltner,
Bautista Nicolet,
Miguel Crespo,
Vicente Leroy y
Ziyi Zhang.
Cuando utilice Mitsuba 3 en proyectos académicos, cite:
@software{Mitsuba3,title = {Mitsuba 3 renderer},autor = {Wenzel Jakob y Sébastien Speierer y Nicolas Roussel y Merlin Nimier-David y Delio Vicini y Tizian Zeltner y Baptiste Nicolet y Miguel Crespo y Vincent Leroy y Ziyi Zhang},nota = {https://mitsuba-renderer.org},versión = {3.1.1},año = 2022}