이 문서는 Parcelable 개체 생성을 단순화하는 Android용 코드 생성 라이브러리인 Parceler에 대한 포괄적인 개요를 제공합니다. 지원되는 데이터 유형, 직렬화 기술, 다형성 처리, 고급 구성, 기타 널리 사용되는 Android 라이브러리와의 통합 등 Parceler의 기능에 대해 자세히 설명합니다. 후반부에서는 연구 중심 렌더링 시스템인 Mitsuba 3를 소개하고 그 기능, 설치 및 사용법을 간략하게 설명합니다.
파셀러
질문이 있나요? StackOverflow에 물어보세요.
문제를 발견하셨나요? 신고해주세요.
Android에서 Parcelable은 컨텍스트 간에 Java 객체를 직렬화하는 좋은 방법입니다.
기존 직렬화와 비교하여 Parcelable은 직렬화 및 역직렬화에 10배 정도 더 적은 시간을 소요합니다.
그러나 Parcelable에는 큰 결함이 있습니다.
Parcelable에는 수많은 상용구 코드가 포함되어 있습니다.
Parcelable을 구현하려면 동일한 순서로 Parcel을 읽고 쓰도록 writeToParcel() 및 createFromParcel() 메서드를 미러링해야 합니다.
또한 Android 인프라가 직렬화 코드를 활용할 수 있도록 Parcelable은 공개 정적 최종 Parcelable.Creator CREATOR를 정의해야 합니다.
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 번들에 추가하여 활동에서 활동으로 전송할 수 있습니다.
그리고 onCreate() 메서드에서 역참조되었습니다.
이 래핑 및 언래핑 기술은 Intent Factory 패턴과 잘 어울립니다.
또한 Parceler는 다음 라이브러리에서 지원됩니다.
Transfuse - @Parcel 주석이 달린 Bean을 @Extra 주입과 함께 사용할 수 있습니다.
FragmentArgs - ParcelerArgsBundler 어댑터를 사용하여 @Parcel 주석이 달린 Bean을 조각 매개변수로 래핑 및 언래핑합니다.
Dart - @Parcel 주석이 달린 빈을 자동 감지하고 @InjectExtra를 사용할 때 자동으로 언래핑합니다.
AndroidAnnotations - @Parcel 주석이 달린 Bean을 자동 감지하고 @Extra, @FragmentArg, @InstanceState 및 기타 번들 관련 주석을 사용할 때 자동으로 래핑/래핑 해제합니다.
ActivityStarter - 기본적으로 Parceler 개체를 활동, 조각, 서비스 등에 대한 인수로 지원합니다.
Remoter - @Remoter 인터페이스의 인수로 기본적으로 Parceler 개체를 지원합니다.
구획 속성 유형
선택된 유형 수만 @Parcel 클래스의 속성으로 사용될 수 있습니다.
다음 목록에는 매핑된 유형이 포함되어 있습니다.
바이트
더블
뜨다
정수
긴
숯
부울
끈
아이바인더
묶음
매핑된 유형의 SparseArray*
SparseBooleanArray
관찰 가능 필드
매핑된 유형의 List, ArrayList 및 LinkedList*
매핑된 모든 유형의 Map, HashMap, LinkedHashMap, SortedMap 및 TreeMap*
매핑된 모든 유형의 Set, HashSet, SortedSet, TreeSet, LinkedHashSet*
소포 가능
직렬화 가능
매핑된 유형의 배열
@Parcel로 주석이 달린 다른 클래스
*일반 매개변수가 매핑되지 않으면 소포에 오류가 발생합니다.
Parceler는 위의 유형을 직접 지원합니다.
이는 @Parcel 주석이 달린 클래스 컬렉션을 처리할 때 특히 유용합니다.
다형성
Parceler는 상속 계층을 언래핑하지 않으므로 모든 다형성 필드는 기본 클래스의 인스턴스로 언래핑됩니다.
이는 Parceler가 모든 데이터 조각에 대해 .getClass()를 확인하는 대신 성능을 선택하기 때문입니다.
다형성 필드 작업의 예는 사용자 정의 직렬화 섹션을 참조하세요.
직렬화 기술
Parceler는 위에 표시된 필드 기반 직렬화 외에도 객체를 직렬화 및 역직렬화하는 방법에 대한 여러 가지 선택 사항을 제공합니다.
게터/세터 직렬화
Parceler는 getter 및 setter 메서드와 비어 있지 않은 생성자를 사용하여 직렬화하도록 구성할 수 있습니다.
또한 @ParcelProperty 주석을 사용하여 필드, 메소드 및 생성자 매개변수를 연결할 수 있습니다.
이는 불변성과 전통적인 getter/setter bean을 포함한 다양한 bean 전략을 지원합니다.
기본 메서드 직렬화를 구성하려면 Serialization.BEAN을 사용하여 @Parcel 주석을 구성하면 됩니다.
직렬화와 함께 생성자를 사용하려면 원하는 생성자에 @ParcelConstructor 주석을 추가하세요.
빈 생성자가 있는 경우 Parceler는 다른 생성자가 주석을 달지 않는 한 해당 생성자를 사용합니다.
getter/setter 및 필드 혼합
@ParcelProperty 주석을 사용하여 직렬화 기술을 혼합하고 일치시킬 수도 있습니다.
다음 예제에서 firstName 및 lastName은 생성자를 사용하여 bean에 기록되고 firstName은 필드를 사용하여 bean에서 읽고 lastName은 getLastName() 메서드를 사용하여 읽습니다.
매개변수 firstName 및 lastName은 매개변수 이름 "first" 및 "last"에 따라 각각 조정됩니다.
Parceler로 직렬화해서는 안 되는 속성의 경우 속성 필드, getter 또는 setter에 @Transient라는 주석을 달 수 있습니다.
Parceler는 POJO를 중심으로 다양한 스타일을 지원합니다.
이를 통해 @Parcel 주석이 달린 클래스를 다음을 포함하여 다른 POJO 기반 라이브러리와 함께 사용할 수 있습니다.
GSON
왕국
찬장
간단한 XML
DB흐름
정적 팩토리 지원
생성자를 직접 사용하는 대신 Parceler는 주석이 달린 정적 팩토리를 사용하여 지정된 클래스의 인스턴스를 빌드하도록 지원합니다.
이 스타일은 불변 빈 생성을 위한 Google의 AutoValue 주석 프로세서/코드 생성 라이브러리를 지원합니다.
Parceler는 정적 팩터리 메서드를 주석이 달린 @Parcel 직렬화에 매핑하는 @ParcelFactory 주석을 통해 AutoValue와 인터페이스합니다.
AutoValue는 주석이 달린 @Parcel과 다른 클래스를 생성하므로 Parcel 유틸리티 클래스에서 Parceler가 빌드해야 하는 클래스를 지정해야 합니다.
그리고 역직렬화하려면:
사용자 정의 직렬화
@Parcel에는 특수 직렬화가 필요한 경우를 위해 수동 직렬 변환기 ParcelConverter를 포함하는 선택적 매개 변수가 포함되어 있습니다.
이는 Parcelable 클래스를 직접 구현하는 것보다 훨씬 더 깔끔한 옵션을 제공합니다.
다음 코드는 역직렬화 중에 상속 계층 구조를 풀기 위해 ParcelConverter를 사용하는 방법을 보여줍니다.
Parceler는 API의 org.parceler.converter 패키지 아래에 위치하여 컬렉션 변환을 더 쉽게 만들기 위해 일련의 기본 클래스와 함께 패키지되어 있습니다.
이러한 기본 클래스는 null 검사 및 수집 반복을 포함하여 컬렉션을 다루는 다양한 어렵거나 장황한 작업을 처리합니다.
예를 들어 위의 ParcelConverter는 `ArrayListParcelConverter'를 사용하여 작성할 수 있습니다.
Java 소스가 없는 클래스
해당 Java 소스를 사용할 수 없는 클래스의 경우 @ParcelClass 주석을 사용하여 클래스를 Parcel로 포함할 수 있습니다.
이 주석은 컴파일된 소스의 편리한 위치 어디에서나 선언될 수 있습니다.
예를 들어 Android 애플리케이션과 함께 @ParcelClass를 포함할 수 있습니다.
@ParcelClasses 주석을 사용하여 여러 @ParcelClass 주석을 선언할 수 있습니다.
또한 @ParcelClass가 참조하는 클래스는 @Parcel 주석을 사용하여 구성할 수 있습니다.
이를 통해 분석할 직렬화 기술이나 클래스를 포함하여 @Parcel 주석에서 사용 가능한 모든 매개변수를 통해 직렬화 구성을 수행할 수 있습니다.
유용한 기술 중 하나는 유형에 대한 전역 사용자 정의 변환기를 정의하는 기능입니다.
이를 통해 직접 수정할 수 없는 클래스를 세밀하게 제어할 수 있습니다.
고급 구성
분석 건너뛰기
일부 라이브러리에서는 기본 클래스를 확장하기 위해 Bean을 요구하는 것이 일반적인 관행입니다.
가장 최적의 경우는 아니지만 Parceler는 analyze 매개변수를 통해 상속 계층 구조의 어떤 클래스를 분석할지 구성할 수 있도록 허용하여 이 방식을 지원합니다.
이 예에서는 BaseClass 및 Two 클래스 매개변수를 모두 피하고 One 및 Three 클래스의 필드만 직렬화됩니다.
특정 포장
Parcels 유틸리티 클래스는 클래스별로 래핑하기 위해 지정된 클래스를 찾습니다.
성능상의 이유로 이는 상위 클래스와 기본 클래스 모두 상속을 무시합니다.
이 문제에 대한 두 가지 해결책이 있습니다.
먼저, 구현 매개변수를 통해 주어진 유형에 연결할 추가 유형을 지정할 수 있습니다.
둘째, Parcels.wrap() 메서드를 사용할 때 클래스 유형을 지정할 수도 있습니다.
Proguard 구성
Proguard를 구성하려면 proguard 구성 파일에 다음 줄을 추가하세요. 이는 Parcels 유틸리티 클래스 및 Parcelable CREATOR 인스턴스와 관련된 파일을 유지합니다.
어
소포 받기
Parceler를 Maven 종속성으로 다운로드할 수 있습니다.
또는 Gradle:
또는 Maven Central에서.
특허
예:
미츠바 렌더러 3
선적 서류 비치 | 튜토리얼 비디오 | 리눅스 | 맥OS | 윈도우 | PyPI |
---|---|---|---|---|---|
️
경고
️
현재 문서화되지 않은 불안정한 작업이 대량으로 진행되고 있습니다.
master
브랜치. 우리는 당신이 우리의 사용을 적극 권장합니다
최신 릴리스
추후 공지가 있을 때까지.
이미 다가오는 변경 사항을 시험해보고 싶다면 다음을 살펴보십시오.
이 포팅 가이드.
여기에는 앞으로 나올 대부분의 새로운 기능과 주요 변경 사항이 포함되어야 합니다.
소개
Mitsuba 3는 순방향 및 역방향 조명을 위한 연구 중심 렌더링 시스템입니다.
스위스 EPFL에서 개발된 운송 시뮬레이션입니다.
핵심 라이브러리와 기능을 구현하는 플러그인 세트로 구성됩니다.
재료와 광원부터 완전한 렌더링 알고리즘까지 다양합니다.
Mitsuba 3은 대상 변경이 가능 합니다. 이는 기본 구현과
데이터 구조는 다양한 작업을 수행하기 위해 변환될 수 있습니다. 을 위한
예를 들어, 동일한 코드로 스칼라(고전적인 한 번에 한 광선) RGB 전송을 모두 시뮬레이션할 수 있습니다.
또는 GPU의 차동 스펙트럼 전송. 이 모든 것이 기반이 됩니다
이 프로젝트를 위해 특별히 개발된 JIT( Just-In-Time ) 컴파일러인 Dr.Jit입니다.
주요 특징
크로스 플랫폼 : Mitsuba 3는 Linux( x86_64
), macOS에서 테스트되었습니다.
( aarch64
, x8664
) 및 Windows ( x8664
).
고성능 : 기본 Dr.Jit 컴파일러는 렌더링 코드를 융합합니다.
다음을 사용하여 최첨단 성능을 달성하는 커널로
CPU 및 CUDA/OptiX 백엔드를 대상으로 하는 LLVM 백엔드
레이 트레이싱 하드웨어 가속을 통해 NVIDIA GPU를 목표로 합니다.
Python 우선 : Mitsuba 3는 Python과 긴밀하게 통합되어 있습니다. 재료,
텍스처, 심지어 전체 렌더링 알고리즘도 Python으로 개발할 수 있습니다.
시스템이 즉석에서 JIT 컴파일(및 선택적으로 차별화)을 수행합니다.
이는 컴퓨터 그래픽 연구에 필요한 실험을 가능하게 하며,
다른 학문.
차별화 : Mitsuba 3는 차별화 가능한 렌더러입니다.
입력에 대한 전체 시뮬레이션의 파생물을 계산할 수 있습니다.
카메라 포즈, 기하학, BSDF, 텍스처 및 볼륨과 같은 매개변수. 그것
EPFL에서 개발된 최근 미분 가능 렌더링 알고리즘을 구현합니다.
스펙트럼 및 편광 : Mitsuba 3는 단색광으로 사용 가능
렌더러, RGB 기반 렌더러 또는 스펙트럼 렌더러. 각 변형은 다음을 수행할 수 있습니다.
원하는 경우 선택적으로 편광 효과를 고려하십시오.
튜토리얼 비디오, 문서
우리는 부드러운 소개를 제공하는 여러 YouTube 비디오를 녹화했습니다.
미츠바3와 Dr.Jit. 이 외에도 완전한 Juypter 노트북을 찾을 수 있습니다.
다양한 애플리케이션, 사용법 가이드, 참조 문서를 다루고 있습니다.
readthedocs에서.
설치
우리는 PyPI를 통해 사전 컴파일된 바이너리 휠을 제공합니다. 이 방법으로 Mitsuba를 설치하는 것은 실행만큼 간단합니다.
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# renderermi.setvariant('scalarrgb')의 변형 설정# 장면 로드 = mi.loaddict(mi.cornellbox())# 장면 렌더링 = mi. render(scene)# 렌더링된 이미지를 EXR 파일에 씁니다mi.Bitmap(img).write('cbox.exr')
다양한 애플리케이션을 다루는 튜토리얼과 예제 노트북을 찾을 수 있습니다.
문서에서.
에 대한
이 프로젝트는 Wenzel Jakob이 만들었습니다.
코드의 중요한 기능 및/또는 개선 사항은 다음에 의해 기여되었습니다.
세바스티앙 슈파이어러,
니콜라스 루셀,
멀린 니미에-데이비드,
델리오 비치니,
티지안 젤트너,
밥티스트 니콜레,
미구엘 크레스포,
빈센트 르로이,
장쯔이.
학술 프로젝트에서 Mitsuba 3를 사용하는 경우 다음을 인용하십시오.
@software{Mitsuba3,title = {Mitsuba 3 렌더러},author = {Wenzel Jakob 및 Sébastien Speierer 및 Nicolas Roussel 및 Merlin Nimier-David 및 Delio Vicini 및 Tizian Zeltner 및 Baptiste Nicolet 및 Miguel Crespo 및 Vincent Leroy 및 Ziyi Zhang},note = {https://mitsuba-renderer.org},버전 = {3.1.1}, 연도 = 2022}