座標系の選択(つまり、1 つのワールド単位が何を意味するかの選択)は、ブラシのイプシロン値の選択と密接に関連しています。座標系は、InProgressStrokesView.startStroke() に渡す inputToWorld 変換行列の値と、ドライ ストロークを描画するときに Canvas に適用する同様の変換に反映されます。
一般的なアプリでは、ワールド単位のみを考慮し、startStroke() の strokeToWorldTransform 引数をデフォルトの単位行列のままにすることができます。
アプリが描画サーフェスのパン、ズーム、回転をサポートしている場合、これらの変換行列の正確な値は時間とともに変化しますが、これらの変化は、ユーザーが描画サーフェスを通して見るカメラによってワールド座標系がどのように表示されるかの変化を反映しています。
ワールド座標系は、各セルがワールド単位のサイズであるグリッドとして視覚化できます。イプシロンは、そのグリッドのサイズであり、世界単位の浮動小数点数です。
ユーザーがコンテンツを拡大すると、ワールド単位グリッドも拡大されるため、デフォルトの 100% ズームレベルでのワールド単位とイプシロン サイズの選択が重要になります。
ワールド単位のサイズ定義とワールド単位のエプシロン値は、アプリのライフタイム全体を通して固定値でなければなりません。
内部実装では、イプシロンを使用して、2 つのポイントが同じポイントとして扱われるためにどの程度近くにある必要があるかを判断します。つまり、イプシロン未満の距離はすべてゼロ距離として扱われます。これは、内部計算の量子化と丸めに使用されます。
妥当なワールド単位のサイズとイプシロン値は何ですか?
さまざまな画面サイズとデバイス密度で移植性を確保するため、ワールド単位のサイズは密度に依存しないようにする必要があります。このようなシナリオの標準的な単位は、密度非依存ピクセル(dp)です。通常は、ワールド単位のサイズとして 1 dp を選択します。
固定イプシロン値を選択する場合は、内部実装の丸め処理でピクセルより大きい距離にならないようにしてください。ワールド単位のサイズが 1 dp の場合、1 dp が 4 px になる高ディスプレイ密度デバイスのピクセル サイズにするには、イプシロンは最大でも 1/4(0.25 ワールド単位)にする必要があります。ただし、ユーザーがコンテンツを最大 10 倍まで拡大しても、イプシロン関連の丸め処理を 1 ピクセル以下に抑えたい場合は、イプシロンを 0.25 を 10 で割った値、つまり 0.025 ワールド単位にする必要があります。
10 倍を超えてズームインできないわけではありませんが、その時点でストローク レンダリングに不正確さやアーティファクトが見られることがあります。
イプシロン値の選択は、ズームイン時の詳細な精度と、次のようなコンピューティング リソースのバランスを取るものです。
- より正確なジオメトリを計算するための CPU サイクル
- そのジオメトリに詳細を保存するメモリ
- そのジオメトリをレンダリングする GPU 時間
これらのガイドラインは妥当なデフォルトですが、ニーズに合った座標系とイプシロン値を選択するために使用できます。
これらの推奨値から大きく外れると、アプリケーションに悪影響を及ぼす可能性があります。たとえば、リソース消費量の増加により、アプリケーションの実行速度が低下する可能性があります。浮動小数点数の精度に関する問題が、奇妙な視覚的アーティファクトとして現れることもあります。