実行時に性質が決定され、事前に計算できないアニメーションコンテンツの最適なレンダリング(および場合によってはキャッシュ)についてのアドバイスを探しています。
私は最初のAndroidアプリを開発しており、比較的短い英数字のコードを使用して画像やアニメーションに変換する(現在の)「おもちゃ」プロジェクトを決定しました。(SourceForgeプロジェクトはhttp://sourceforge.net/projects/picturecodeにあり、設計ドキュメントはhttps://docs.google.com/file/d/0B-yO-2scTVuRSkk2NDdiZ3YzTDg/edit?usp=sharingにあります)
私は、他のコード内に事前定義されたコードとユーザー定義のコードをネストして、さらに短いコードでさらに複雑な画像を作成できるようにする操作を考案しているところです。私はまた、同様に複雑であるが、比較的単純なコード表現で興味深い画像を支援する関連操作を考案しようとしています。
そのため、私が役立つと思った操作の1つは、事前定義またはユーザー定義のコードをマスクとして使用して、他の描画操作をクリップする機能です。クリップパスがハードウェアアクセラレーションされたビューでサポートされていないことを発見し、ビューをソフトウェアベースにすることを強制した後、これを機能させることができました。(私のレンダラーは、「クリッピングパス」を定義し、キャンバスに描画する代わりにパスに操作を追加するモードにあるかどうかを確認しますが、それは面倒で、すべての操作をサポートしているわけではありません。)
ハードウェアアクセラレーションモードに戻すための代替案を検討しています。頭に浮かぶのは、クリッピングモードのときにクリッピングパスを作成する代わりに、ALPHA_888ビットマップを作成してそれに描画することです。これが持つ可能性のある利点の1つは、任意の操作をサポートする方が簡単なことです。クリッピングモードでは、メインキャンバスではなく、そのビットマップに描画します。ビットマップを取得したら、適切なPorterDuffモードでペイントを使用してdrawBitmapで(別の中間ビットマップに)何らかの方法で使用できると思います。
いつの日か私(またはプロジェクトがSourceForgeにあるので、誰でも)は、プレーンテキストで、ただし短い/最適化された形式で転送できるグラフィックスを表す軽量の方法として、このコンポーネントをより大きなプロジェクトで再利用する可能性があります。私はそれをアニメーションGIFとして見ていますが、作成は簡単で、転送は小さくなっています。
私の質問は次のとおりです。
- ハードウェアアクセラレーションは一般的にどのくらい重要ですか?これは保持する重要な機能ですか、それとも他の機能を優先してそれを放棄する必要がありますか?(他の人がこの機能を使用する場合、コンポーネントをハードウェアアクセラレーションと互換性があることを望んでいることが多いと思います。)
- マスキングは強力で重要な操作ですか、それとも代わりに使用できるより良いものがありますか(純粋なポーターダフフィルターでキャンバスに直接描画するなど)?
- 複雑なマスキングを実装するための正しい道を考えていますか?
最後にそして最も重要なこと:
- ビットマップ(マスクビットマップなど)を使用および管理するにはどうすればよいですか?プロジェクトを開始したとき、OnDraw中に新しいオブジェクトを割り当てることはお勧めできないことに気づきました。そこで、ペイント、PointF、RectF、パス、その他いくつかの可能な限りすべてを事前に割り当てて、onDraw中にそれらを使用できるようにしました。現時点では、まだキャンバスに直接描画していますが、別のスレッドでビットマップなどのある種のバッファーにレンダリングしてから、onDraw中に画面にバッファーを描画する必要があるかどうか疑問に思っています。それはハードウェアアクセラレーションの目的を無効にしますか(そして、そもそもビュー自体でハードウェアアクセラレーションをオフにする必要がなくなります)?さらに重要なのは、onDraw中にメモリを割り当てるのが悪いことを知っている、lintや熟練したAndroid開発者を怒らせることなく、これらのビットマップを安全に割り当てる方法とタイミングを教えてください。ビットマップを別の描画スレッドに割り当てる場合、これらの画像はアニメーションである可能性があるため、含まれる/埋め込まれる各画像のフレームごとに1回割り当てる必要がある場合があります。または、画像の複数の部分を切り取ったり作成したりするのに役立つように、現在のフレームにビットマップを割り当てたい場合があります。
これを非常に具体的な質問に絞り込むのは難しいです。私が持っているのは、混乱した質問と、私が気付かないかもしれない機能やアイデアについての一般的なアドバイスの要求の間のどこかにあります。私はJavaとAndroidの開発に比較的慣れていませんが、C#、2Dグラフィックス、およびゲーム開発に精通しています。私の質問は、Androidで2Dアニメーションがどのように機能するかを理解する上での明白な穴を指摘していますか?