このドキュメントでは、Parcelable オブジェクトの作成を簡素化する Android 用のコード生成ライブラリである Parceler の包括的な概要を説明します。サポートされているデータ型、シリアル化手法、ポリモーフィズムの処理、高度な構成などの Parceler の機能と、他の一般的な Android ライブラリとの統合について詳しく説明します。後半では研究向けレンダリングシステム「Mitsuba 3」を紹介し、その機能、インストール、使用方法の概要を説明します。
パーセラー
質問がありますか? StackOverflow で質問してください。
問題が見つかりましたか?報告してください。
Android では、Parcelable はコンテキスト間で Java オブジェクトをシリアル化する優れた方法です。
従来のシリアル化と比較して、Parcelables ではシリアル化と逆シリアル化の両方にかかる時間が 10 分の 1 程度短くなります。
ただし、Parcelables には大きな欠陥があります。
Parcelable には大量の定型コードが含まれています。
Parcelable を実装するには、同じ順序で Parcel の読み取りと書き込みが行われるように、writeToParcel() メソッドと createFromParcel() メソッドをミラーリングする必要があります。
また、Android インフラストラクチャがシリアル化コードを利用できるようにするには、Parcelable で public static Final Parcelable.Creator CREATOR を定義する必要があります。
Parceler は、Android Parcelable ボイラープレート ソース コードを生成するコード生成ライブラリです。
Parcelable インターフェイス、writeToParcel() または createFromParcel()、または public static Final CREATOR を実装する必要はなくなりました。
POJO に @Parcel のアノテーションを付けるだけで、残りの作業は Parceler が行います。
Parceler は Java JSR-269 アノテーション プロセッサを使用するため、Parcelable コードを生成するためにツールを手動で実行する必要はありません。
Java Bean にアノテーションを付けてコンパイルするだけで完了です。
デフォルトでは、Paceler はインスタンスのフィールドを直接シリアル化します。
デフォルトのフィールドシリアル化戦略を使用する場合は、リフレクションによるパフォーマンスの低下が生じるため、プライベート フィールドを使用しないように注意してください。
生成されたコードを使用するには、生成されたクラスを直接参照するか、Parcels ユーティリティ クラスを介して参照できます。
@Parcel を逆参照するには、Parcels.unwrap() メソッドを呼び出すだけです。
もちろん、ラップされた Parcelable を Android バンドルに追加して、アクティビティからアクティビティに転送することもできます。
そして、onCreate() メソッドで逆参照されます。
このラッピングとラッピング解除の手法は、Intent Factory パターンとうまく連携します。
さらに、Paceler は次のライブラリでもサポートされています。
Transfuse - @Parcel アノテーション付き Bean を @Extra インジェクションで使用できるようにします。
FragmentArgs - ParcelerArgsBundler アダプターを使用して、@Parcel アノテーション付き Bean をフラグメント パラメーターでラップおよびラップ解除します。
Dart - @Parcel アノテーション付き Bean を自動検出し、@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 アノテーションが付けられたその他のクラス
*汎用パラメータがマップされていない場合、Parcel はエラーになります。
Parceler は、上記のタイプのいずれも直接サポートします。
これは、@Parcel アノテーションが付けられたクラスのコレクションを扱う場合に特に便利です。
ポリモーフィズム
Parceler は継承階層をアンラップしないため、多態性フィールドは基本クラスのインスタンスとしてアンラップされることに注意してください。
これは、Paceler がデータのすべての部分に対して .getClass() をチェックするのではなく、パフォーマンスを選択するためです。
多態性フィールドの操作例については、「カスタム シリアル化」セクションを参照してください。
シリアル化テクニック
Parceler では、上記のフィールドベースのシリアル化に加えて、オブジェクトをシリアル化および逆シリアル化する方法についていくつかの選択肢が提供されます。
ゲッター/セッターのシリアル化
Parceler は、ゲッター メソッドとセッター メソッド、および空ではないコンストラクターを使用してシリアル化するように構成できます。
さらに、@ParcelProperty アノテーションを使用して、フィールド、メソッド、およびコンストラクター パラメーターを関連付けることができます。
これにより、不変性や従来のゲッター/セッター Bean など、多くの Bean 戦略がサポートされます。
デフォルトのメソッドのシリアル化を構成するには、Serialization.BEAN を使用して @Parcel アノテーションを構成するだけです。
シリアル化でコンストラクターを使用するには、目的のコンストラクターに @ParcelConstructor アノテーションを付けます。
空のコンストラクターが存在する場合、別のコンストラクターに注釈が付けられていない限り、Parceler はそのコンストラクターを使用します。
ゲッター/セッターとフィールドの混合
@ParcelProperty アノテーションを使用して、シリアル化手法を組み合わせて使用することもできます。
次の例では、firstName と lastName はコンストラクターを使用して Bean に書き込まれますが、firstName はフィールドを使用して Bean から読み取られ、lastName は getLastName() メソッドを使用して読み取られます。
パラメータ firstName と lastName は、パラメータ名「first」と「last」によってそれぞれ調整されます。
Parceler でシリアル化すべきではない属性の場合、属性フィールド、ゲッター、またはセッターに @Transient による注釈が付けられる場合があります。
Parceler は、POJO を中心としたさまざまなスタイルをサポートしています。
これにより、@Parcel アノテーション付きクラスを次のような他の POJO ベースのライブラリで使用できるようになります。
GSON
レルム
戸棚
単純な XML
DBフロー
静的ファクトリーのサポート
コンストラクターを直接使用する代わりに、Parceler は、アノテーション付きの Static Factory を使用して、指定されたクラスのインスタンスを構築することをサポートしています。
このスタイルは、不変 Bean を生成するための Google の AutoValue アノテーション プロセッサ/コード生成ライブラリをサポートします。
Parceler は @ParcelFactory アノテーションを介して AutoValue とインターフェースし、静的ファクトリ メソッドをアノテーション付き @Parcel シリアル化にマップします。
AutoValue は、アノテーションが付けられた @Parcel とは異なるクラスを生成するため、Parceler がどのクラスを Parcels ユーティリティ クラスで構築するかを指定する必要があります。
そして逆シリアル化するには:
カスタムシリアル化
@Parcel には、特別なシリアル化が必要な場合に備えて手動シリアライザー ParcelConverter を含めるオプションのパラメーターが含まれています。
これにより、Parcelable クラスを手動で実装するよりもクリーンなオプションを使用できるようになります。
次のコードは、ParcelConverter を使用して、逆シリアル化中に継承階層のラップを解除する方法を示しています。
Parceler には、API の org.parceler.converter パッケージの下にあるコレクション変換を容易にする一連の基本クラスもパッケージ化されています。
これらの基本クラスは、null チェックや収集の反復など、コレクションを処理するさまざまな困難または冗長なジョブを処理します。
たとえば、上記の ParcelConverter は、「ArrayListParcelConverter」を使用して作成できます。
Java ソースのないクラス
対応する Java ソースが利用できないクラスの場合は、 @ParcelClass アノテーションを使用してクラスを Parcel として含めることができます。
このアノテーションは、コンパイルされたソース内の都合の良い場所で宣言できます。
たとえば、Android アプリケーションと一緒に @ParcelClass を含めることができます。
@ParcelClasses アノテーションを使用して、複数の @ParcelClass アノテーションを宣言できます。
さらに、@ParcelClass によって参照されるクラスは、@Parcel アノテーションを使用して構成できます。
これにより、分析するシリアル化手法やクラスなど、 @Parcel アノテーションで使用可能な任意のパラメーターを使用してシリアル化設定を行うことができます。
便利な手法の 1 つは、型のグローバル カスタム コンバーターを定義できることです。
これにより、直接変更できないクラスをきめ細かく制御できるようになります。
高度な構成
解析をスキップする
一部のライブラリでは、基本クラスを拡張するために Bean を必要とするのが一般的です。
これは最適なケースではありませんが、Parceler は、analyze パラメーターを介して継承階層内のどのクラスを分析するかを構成できるようにすることで、このプラクティスをサポートします。
この例では、One クラスと Three クラスのフィールドのみがシリアル化され、BaseClass と Two クラスのパラメーターの両方が回避されます。
特殊なラッピング
Parcels ユーティリティ クラスは、クラスごとにラップするために指定されたクラスを検索します。
パフォーマンス上の理由から、これはスーパークラスと基本クラスの両方の継承を無視します。
この問題には 2 つの解決策があります。
まず、実装パラメータを介して、特定の型に関連付ける追加の型を指定できます。
次に、Parcels.wrap() メソッドを使用するときにクラス タイプを指定することもできます。
Proguard の構成
Proguard を構成するには、proguard 構成ファイルに次の行を追加します。これらには、Parcels ユーティリティ クラスと Parcelable CREATOR インスタンスに関連するファイルが保持されます。
えーっと
パーセラーの取得
Parceler を Maven 依存関係としてダウンロードできます。
またはグラドル:
または Maven Central から。
ライセンス
例:
ミツバレンダラー3
ドキュメント | チュートリアルビデオ | Linux | MacOS | 窓 | PyPI |
---|---|---|---|---|---|
️
警告
️
現在、文書化されていない不安定な作業が大量に行われています。
master
ブランチ。ぜひご利用ください。
最新リリース
追って通知があるまで。
今後の変更をすでに試してみたい場合は、こちらをご覧ください。
この移植ガイド。
今後の新機能と重大な変更のほとんどがカバーされているはずです。
導入
ミツバ 3 は、順光と逆光の研究指向のレンダリング システムです。
スイスのEPFLで開発された輸送シミュレーション。
コア ライブラリと機能を実装するプラグインのセットで構成されます。
マテリアルや光源から完全なレンダリング アルゴリズムに至るまで。
ミツバ 3 は再ターゲット可能です。これは、基礎となる実装と
データ構造は、さまざまな異なるタスクを実行するために変換できます。のために
たとえば、同じコードで両方のスカラー (一度に 1 レイずつの古典的な) RGB トランスポートをシミュレートできます。
または GPU 上の差分スペクトル転送。これはすべてに基づいています
Dr.Jit は、このプロジェクトのために特別に開発された特殊なジャストインタイム(JIT) コンパイラーです。
主な特長
クロスプラットフォーム:Mitsuba 3 は Linux ( x86_64
)、macOS でテストされています
( aarch64
、 x8664
)、および Windows ( x8664
)。
高いパフォーマンス: 基盤となる Dr.Jit コンパイラーがレンダリング コードを融合します
を使用して最先端のパフォーマンスを実現するカーネルに組み込まれます。
CPU をターゲットとする LLVM バックエンドと CUDA/OptiX バックエンド
レイ トレーシング ハードウェア アクセラレーションを備えた NVIDIA GPU をターゲットとしています。
Python ファースト: ミツバ 3 は Python と深く統合されています。材料、
テクスチャ、さらには完全なレンダリング アルゴリズムさえも Python で開発できます。
これは、システムによってオンザフライで JIT コンパイル (およびオプションで微分) されます。
これにより、コンピュータ グラフィックスの研究に必要な実験が可能になり、
他の分野。
微分: ミツバ 3 は微分可能なレンダラーです。
入力に関するシミュレーション全体の導関数を計算できます
カメラのポーズ、ジオメトリ、BSDF、テクスチャ、ボリュームなどのパラメータ。それ
EPFL で開発された最近の微分可能レンダリング アルゴリズムを実装します。
スペクトルと偏光:Mitsuba 3 は単色として使用可能
レンダラー、RGB ベースのレンダラー、またはスペクトル レンダラー。各バリアントでは、
必要に応じて、分極の影響をオプションで考慮します。
チュートリアルビデオ、ドキュメント
優しい紹介を提供する YouTube ビデオをいくつか録画しました。
ミツバ3とドクタージット。さらに、完全な 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
最初の 2 つは、RGB のいずれかを使用して、一度に 1 レイずつの古典的なシミュレーションを実行します。
またはスペクトル色表現、後者の 2 つは逆変換に使用できます。
CPU または GPU でのレンダリング。追加のバリアントにアクセスするには、次のことを行う必要があります。
CMake を使用して Dr.Jit のカスタム バージョンをコンパイルします。をご覧ください。
ドキュメント
詳細については。
要件
Python >= 3.8
(オプション) GPU での計算の場合: Nvidia driver >= 495.89
(オプション) CPU でのベクトル化/並列計算の場合: LLVM >= 11.1
使用法
これは、レンダリングがいかに簡単であるかを示す単純な「Hello World」の例です。
PythonからMitsuba 3を使用したシーン:
# エイリアス "mi" を使用してライブラリをインポートしますimport tsuba as mi# renderer のバリアントを設定します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,title = {Mitsuba 3 renderer},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://tsuba-renderer.org}、バージョン = {3.1.1}、年 = 2022}