В этом документе представлен подробный обзор 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() или общедоступный статический финальный CREATOR.
Вы просто аннотируете POJO с помощью @Parcel, а Parceler делает все остальное.
Поскольку Parceler использует процессор аннотаций Java JSR-269, нет необходимости запускать инструмент вручную для создания кода Parcelable.
Просто аннотируйте свой Java Bean, скомпилируйте, и все готово.
По умолчанию Parceler будет сериализовать поля вашего экземпляра напрямую:
Будьте осторожны и не используйте частные поля при использовании стратегии сериализации полей по умолчанию, поскольку это приведет к снижению производительности из-за отражения.
Чтобы использовать сгенерированный код, вы можете напрямую ссылаться на сгенерированный класс или через служебный класс Parcels:
Чтобы разыменовать @Parcel, просто вызовите метод Parcels.unwrap():
Конечно, завернутый Parcelable можно добавить в Android Bundle для передачи из Activity в Activity:
И разыменовывается в методе onCreate():
Эта техника переноса и развертывания хорошо сочетается с шаблоном Intent Factory.
Кроме того, Parceler поддерживается следующими библиотеками:
Transfuse — позволяет использовать bean-компоненты с аннотациями @Parcel вместе с инъекцией @Extra.
FragmentArgs — использует адаптер ParcelerArgsBundler для переноса и развертывания аннотированных bean-компонентов @Parcel с параметрами фрагмента.
Dart — автоматически обнаруживает аннотированные bean-компоненты @Parcel и автоматически разворачивает их при использовании @InjectExtra.
AndroidAnnotations — автоматически определяет аннотированные bean-компоненты @Parcel и автоматически упаковывает/разворачивает их при использовании @Extra, @FragmentArg, @InstanceState и других аннотаций, связанных с Bundle.
ActivityStarter — изначально поддерживает объекты Parceler в качестве аргументов для действий, фрагментов, служб и т. д.
Remoter — изначально поддерживает объекты Parceler в качестве аргументов в интерфейсах @Remoter.
Типы атрибутов участков
В качестве атрибутов класса @Parcel можно использовать только избранное количество типов.
Следующий список включает сопоставленные типы:
байт
двойной
плавать
интервал
длинный
голец
логическое значение
Нить
IBinder
Пучок
SparseArray любого из отображаемых типов*
SparseBooleanМассив
НаблюдаемоеПоле
List, ArrayList и LinkedList любого из отображаемых типов*
Map, HashMap, LinkedHashMap, SortedMap и TreeMap любого из сопоставленных типов*
Set, HashSet, SortedSet, TreeSet, LinkedHashSet любого из отображаемых типов*
посылки
Сериализуемый
Массив любого из отображаемых типов
Любой другой класс, помеченный @Parcel.
*Parcel выдаст ошибку, если общий параметр не сопоставлен.
Parceler также напрямую поддерживает любой из вышеперечисленных типов.
Это особенно полезно при работе с коллекциями классов, аннотированных @Parcel:
Полиморфизм
Обратите внимание, что Parceler не разворачивает иерархии наследования, поэтому любые полиморфные поля будут развернуты как экземпляры базового класса.
Это связано с тем, что Parceler выбирает производительность, а не проверку .getClass() для каждого фрагмента данных.
В разделе «Пользовательская сериализация» приведен пример работы с полиморфными полями.
Методы сериализации
Parceler предлагает несколько вариантов сериализации и десериализации объекта в дополнение к сериализации на основе полей, показанной выше.
Сериализация геттер/сеттер
Parceler можно настроить для сериализации с использованием методов получения и установки, а также непустого конструктора.
Кроме того, поля, методы и параметры конструктора могут быть связаны с помощью аннотации @ParcelProperty.
Это поддерживает ряд стратегий bean-компонентов, включая неизменяемость и традиционные bean-компоненты получения/установки.
Чтобы настроить сериализацию метода по умолчанию, просто настройте аннотацию @Parcel с помощью Serialization.BEAN:
Чтобы использовать конструктор с сериализацией, добавьте к нужному конструктору аннотацию @ParcelConstructor:
Если присутствует пустой конструктор, Parceler будет использовать этот конструктор, если не будет аннотирован другой конструктор.
Смешивание геттеров/сеттеров и полей
Вы также можете комбинировать методы сериализации, используя аннотацию @ParcelProperty.
В следующем примере firstName и LastName записываются в компонент с помощью конструктора, firstName считывается из компонента с помощью поля, а LastName считывается с помощью метода getLastName().
Параметры firstName и LastName координируются именами параметров «first» и «last» соответственно.
Для атрибутов, которые не следует сериализовать с помощью Parceler, поле атрибута, метод получения или установки могут быть аннотированы @Transient.
Parceler поддерживает множество различных стилей, основанных на POJO.
Это позволяет использовать аннотированные классы @Parcel с другими библиотеками на основе POJO, включая следующие:
ГСОН
Область
Буфет
Простой XML
ДБФлоу
Поддержка статической фабрики
В качестве альтернативы непосредственному использованию конструктора Parceler поддерживает использование аннотированной статической фабрики для создания экземпляра данного класса.
Этот стиль поддерживает процессор аннотаций/библиотеку генерации кода Google AutoValue для создания неизменяемых bean-компонентов.
Parceler взаимодействует с AutoValue через аннотацию @ParcelFactory, которая сопоставляет статический фабричный метод с аннотированной сериализацией @Parcel:
AutoValue генерирует класс, отличный от аннотированного @Parcel, поэтому вам необходимо указать, какой класс Parceler должен построить в служебном классе Parcels:
И для десериализации:
Пользовательская сериализация
@Parcel включает необязательный параметр для включения ручного сериализатора ParcelConverter на случай, если необходима специальная сериализация.
Это обеспечивает еще более чистый вариант использования классов Parcelable, чем их реализация вручную.
Следующий код демонстрирует использование ParcelConverter для развертывания иерархии наследования во время десериализации.
Parceler также поставляется с рядом базовых классов, упрощающих преобразование коллекций, которые расположены в пакете org.parceler.converter API.
Эти базовые классы выполняют множество сложных или многословных задач, связанных с коллекциями, включая проверки на нулевое значение и итерацию сбора.
Например, приведенный выше ParcelConverter можно написать с использованием ArrayListParcelConverter:
Классы без исходного кода Java
Для классов, соответствующий исходный код Java недоступен, можно включить класс как Parcel, используя аннотацию @ParcelClass.
Эту аннотацию можно объявить в любом удобном месте скомпилированного исходного кода.
Например, можно включить @ParcelClass вместе с приложением Android:
С помощью аннотации @ParcelClasses можно объявить несколько аннотаций @ParcelClass.
Кроме того, классы, на которые ссылается @ParcelClass, можно настроить с помощью аннотации @Parcel.
Это позволяет настраивать сериализацию с помощью любого параметра, доступного в аннотации @Parcel, включая метод сериализации или классы для анализа.
Одним из полезных методов является возможность определять глобальные пользовательские преобразователи для типа:
Это обеспечивает детальный контроль над классом, который недоступен для прямого изменения.
Расширенная конфигурация
Пропуск анализа
Некоторые библиотеки часто требуют, чтобы компонент расширял базовый класс.
Хотя это не самый оптимальный случай, Parceler поддерживает эту практику, позволяя настраивать, какие классы в иерархии наследования анализировать, с помощью параметра анализа:
В этом примере будут сериализованы только поля классов One и Three, без параметров классов BaseClass и Two.
Специальная упаковка
Утилитный класс Parcels ищет данный класс для переноса по классу.
Из соображений производительности это игнорирует наследование как суперклассов, так и базовых классов.
Есть два решения этой проблемы.
Во-первых, можно указать дополнительные типы, которые будут связаны с данным типом, через параметр реализации:
Во-вторых, при использовании метода Parcels.wrap() также можно указать тип класса:
Настройка Прогарда
Чтобы настроить Proguard, добавьте следующие строки в файл конфигурации proguard. В них будут храниться файлы, связанные с служебным классом Parcels и экземпляром Parcelable CREATOR:
эээ
Получение посылки
Вы можете скачать Parceler как зависимость Maven:
или Градл:
Или из Maven Central.
Лицензия
пример:
Мицуба Рендерер 3
Документация | Обучающие видео | Линукс | MacOS | Окна | ПиПИ |
---|---|---|---|---|---|
️
Предупреждение
️
В настоящее время в мире ведется большой объем недокументированной и нестабильной работы.
master
ветка. Мы настоятельно рекомендуем вам воспользоваться нашим
последний выпуск
до дальнейшего уведомления.
Если вы уже хотите опробовать предстоящие изменения, ознакомьтесь с
это руководство по портированию.
Он должен охватывать большинство новых функций и предстоящих кардинальных изменений.
Введение
Mitsuba 3 — это исследовательская система рендеринга прямого и обратного света.
транспортное моделирование, разработанное в EPFL в Швейцарии.
Он состоит из базовой библиотеки и набора плагинов, реализующих функциональность.
начиная от материалов и источников света и заканчивая полными алгоритмами рендеринга.
Mitsuba 3 является перенацеливаемой : это означает, что базовые реализации и
Структуры данных могут трансформироваться для выполнения различных задач. Для
Например, один и тот же код может моделировать скалярный (классический по одному лучу) транспорт RGB
или дифференциальный спектральный транспорт на графическом процессоре. Все это основано на
Dr.Jit — специализированный JIT -компилятор, разработанный специально для этого проекта.
Основные характеристики
Кроссплатформенность : Mitsuba 3 была протестирована на Linux ( x86_64
), macOS.
( aarch64
, x8664
) и Windows ( x8664
).
Высокая производительность : базовый компилятор Dr.Jit объединяет код рендеринга.
в ядра, которые достигают высочайшей производительности, используя
серверная часть LLVM, ориентированная на ЦП, и серверная часть CUDA/OptiX
ориентированы на графические процессоры NVIDIA с аппаратным ускорением трассировки лучей.
Python прежде всего : Mitsuba 3 глубоко интегрирован с Python. Материалы,
текстуры и даже полные алгоритмы рендеринга могут быть разработаны на Python,
который система JIT-компилирует (и, при необходимости, дифференцирует) на лету.
Это позволяет проводить эксперименты, необходимые для исследований в области компьютерной графики и
другие дисциплины.
Дифференциация : Mitsuba 3 — это дифференцируемый рендерер, то есть он
может вычислять производные всей симуляции относительно входных данных
такие параметры, как поза камеры, геометрия, BSDF, текстуры и объемы. Это
реализует последние алгоритмы дифференцируемого рендеринга, разработанные в EPFL.
Спектральный и поляризационный : Mitsuba 3 можно использовать как монохроматический.
рендерер, рендерер на основе RGB или спектральный рендерер. Каждый вариант может
при необходимости, при необходимости, учтите эффекты поляризации.
Обучающие видеоролики, документация
Мы записали несколько видеороликов на YouTube, которые дают краткое представление.
Мицуба 3 и Доктор Джит. Помимо этого вы можете найти полные блокноты Juypter.
охватывающий различные приложения, практические руководства и справочную документацию.
на прочтенной документации.
Установка
Мы предоставляем предварительно скомпилированные двоичные колеса через PyPI. Установить Mitsuba таким способом так же просто, как запустить
pip установить Мицубу
в командной строке. Пакет Python по умолчанию включает тринадцать вариантов:
scalar_rgb
scalar_spectral
scalarspectralpolarized
llvmadrgb
llvmadmono
llvmadmono_polarized
llvmadspectral
llvmadspectral_polarized
cudaadrgb
cudaadmono
cudaadmono_polarized
cudaadspectral
cudaadspectral_polarized
Первые два выполняют классическое моделирование по одному лучу с использованием RGB
или спектральное представление цвета, тогда как последние два могут использоваться для обратного
рендеринг на CPU или GPU. Чтобы получить доступ к дополнительным вариантам, вам необходимо
скомпилируйте собственную версию Dr.Jit с помощью CMake. Пожалуйста, ознакомьтесь с
документация
для получения подробной информации об этом.
Требования
Python >= 3.8
(необязательно) Для вычислений на графическом процессоре: Nvidia driver >= 495.89
(необязательно) Для векторизованных/параллельных вычислений на ЦП: LLVM >= 11.1
Использование
Вот простой пример «Hello World», который показывает, насколько просто визуализировать
сцена с использованием Mitsuba 3 из Python:
# Импортируйте библиотеку, используя псевдоним "mi"import mitsuba as mi# Установите вариант renderermi.setvariant('scalarrgb')# Загрузите сценуscene = mi.loaddict(mi.cornellbox())# Отрисуйте сценуimg = mi. render(scene)# Запишите визуализированное изображение в файл EXRmi.Bitmap(img).write('cbox.exr')
Учебные пособия и блокноты с примерами, охватывающие различные приложения, можно найти.
в документации.
О
Этот проект создал Венцель Якоб.
Значительные функции и/или улучшения кода были внесены
Себастьян Шпейерер,
Николя Руссель,
Мерлин Нимье-Дэвид,
Делио Вичини,
Тициан Зельтнер,
Батист Николе,
Мигель Креспо,
Винсент Лерой и
Цзыи Чжан.
При использовании Mitsuba 3 в академических проектах указывайте:
@software{Mitsuba3,title = {рендерер Mitsuba 3},author = {Венцель Якоб и Себастьян Шпейерер и Николя Руссель и Мерлин Нимьер-Давид и Делио Вичини и Тициан Зельтнер и Батист Николе и Мигель Креспо и Винсент Лерой и Зийи Чжан},note = {https://mitsuba-renderer.org},версия = {3.1.1}, год = 2022}