2012-10-22 24 views
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()用に1つ、getY()用に1つ、getter呼び出しごとにfloat配列を作成します。画面上にたくさんの要素があると仮定すると、これはメモリとパフォーマンスに影響を与える可能性があります。

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

誰かが好きな方法でチップを持っていますか?

答えて

2

を行うのに最適な方法はないと思います。

2番目のアプローチで私の前提は完全に間違っています。要素を100/100に変換すると、原点は100/100に変更されます。もちろんキャンバスにも当てはまります。否定的な考えは私の全然ナンセンスでした。

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

  1. 描画される各要素は、回転、平行移動とスケールが含まれている彼自身のマトリックスを持ちます。
  2. キャンバスはsave()で保存され、提供されたメソッドconcat(Matrix matrix)でマトリックスの要素が適用されます。描画が完了し、キャンバスはrestore()で復元されます。
  3. 他のドロウアブルの親である各drawable Elementは、同じ方法で子をループして保存し、連結し、復元します。

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

1

パフォーマンス上の理由から、内部行列メソッドを使用するほうがおそらく高速です。なぜなら、ライブラリが自動的にハードウェアアクセラレーションを実行できるからです。また、ハードウェアが高速化されるかどうかは私には分かりません。

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

ドロアブル要素を言うとき、Android Drawablesを使用している場合、カスタムDrawableクラスを作成することもできます。

私は、確かに両方のソリューションを組み合わせなければならないと思われ、この

+1

私の研究結果を掲載しました。私は本当にあなたの答えから何か新しいものを得ることができませんでしたが、私はあなたの努力のためにあなたをアップフォートします。 – WarrenFaith

関連する問題