5

一部のアプリケーションの基礎として小さなライブラリを開発しています。シーングラフ (2D) を作成しようとしているので、パフォーマンス、保守性、使いやすさなどの観点から、次のアプローチのどれがより有望に見えるか疑問に思っています.

  1. 各ドローアブル要素に、平行移動や回転などを実行するマトリックスを与えることができます。
  2. 要素ではなく、キャンバス上ですべてを行うことができました。

最初の解決策には欠点があります。描画呼び出しで行列を渡すことができない円のようなプリミティブ要素の場合、次のように行列から変換された値にアクセスする必要があります。

private float get(int index) {
    final float[] values = new float[9];
    getValues(values);
    return values[index];
}

public float getX() {
    return get(Matrix.MTRANS_X);
}

public float getY() {
    return get(Matrix.MTRANS_Y);
}

したがって、すべての描画呼び出しで、getter 呼び出しごとに float 配列を作成します (getX() 用に 1 つ、getY() 用に 1 つ)。画面上に多くの要素があると仮定すると、メモリとパフォーマンスに影響を与える可能性があります。

2 番目のアプローチには、「否定的な」考え方という欠点があります。要素を点 100/100 に描画する場合は、キャンバスを 0/0 に描画するように -100/-100 に変換する必要があります。その後キャンバスを元に戻すと、必要な 100/100 に要素が描画されます。この否定的な考え方がコードの保守性と理解の低下に大きな影響を与えるかどうかはわかりません (単に何かを否定するのを忘れてバグを導入することを考え始めたことさえありません...)。

誰かがどの方法を優先すべきかのヒントを持っていますか?

4

2 に答える 2

2

実際、両方のソリューションを組み合わせる必要があるようです。

2番目のアプローチに関する私の仮定は完全に間違っています。要素を 100/100 に変換すると、原点が 100/100 に変更されます。もちろん、同じことがキャンバスにも当てはまります。ネガティブな考え方は、私にとってまったくナンセンスでした。

組み合わせた結果は次のようになります。

  1. 描画される各要素には、回転、平行移動、およびスケールを含む独自のマトリックスがあります。
  2. キャンバスは を介し​​て保存されsave()、提供されたメソッドを使用concat(Matrix matrix)して要素のマトリックスを適用できます。描画が完了し、 でキャンバスが復元されrestore()ます。
  3. 他のドローアブルの親である各ドローアブル要素は、子をループし、同じ方法で保存、連結、および復元します。

これにより、大規模な実装作業なしで 2D シーン グラフの実装が可能になります。

于 2012-10-24T18:11:17.510 に答える
1

パフォーマンス上の理由から、ライブラリを自動的にハードウェア アクセラレーションできるようにするため、内部マトリックス メソッドを使用する方がおそらく高速です。繰り返しになりますが、それがハードウェア アクセラレーションになるかどうかは完全にはわかりません。

#2は楽しい方法です。長期的には、より多くのパワーと柔軟性が得られることは間違いありません。また、この 2 つを組み合わせることもできます。

#3もあります:ドローアブル要素と言うとき、Androidドローアブルを使用している場合は、カスタムのドローアブルクラスを作成できます。

これを行う完璧な方法はないと思います

于 2012-10-23T19:59:59.660 に答える