透過性のものは、最小限に抑えて、非常に古いハンドセットから遠ざかる限り、遅くする必要はありません。また、いくつかの実装ではアルファが無視されることがあり、醜いレベルに量子化されることがあります(モトローラの電話によってはアルファ値が最も近い2ビット値にスナップされます)。
私は、スクリーンに重ね合わせた単一の透明なレイヤーとしてこのアプローチに挑戦したいと思います。透明なピクセル(int [width * height])をプロットするスクリーンのサイズをint配列にしておきます。各フレームで、Image.createRGBImageを呼び出し、そのイメージを画面に描画します。
実験として、アルファ処理では、この配列に一定の値を入力し、それを画面にプロットすることで、アルファ処理が遅くならないようにしたい場合があります。例えば。 0x80FF0000は画面に赤い色合いを混ぜる必要があります。このアルファビジネスが選択した端末で動作可能になると、つまりフレームレートにどのように影響するかを測定できます。
次に、この配列に円をプロットする必要があります。 Bresenham's circle drawing algorithmを探し、それをピクセルのint配列にプロットするように再作成します。プロットできる半径ごとに事前に計算された半径/ sqrt(2)を持つルックアップテーブルを維持したい場合があります。
次に、色をブレンドして重なり合わせる方法です。最も単純なのは、アルファを含むカラー値をピクセルにプロットすることだけです。既にプロットされたサークルとの色のブレンドはできませんが、安くてサークルは背景と混ざります。
もう1つの方法は、カラーブレンドを無視することですが、アルファを単純にマージすることです。例えば。
newColour = ((destColour & 0xFF000000) + 0x20000000) | srcColour;
/* Where source colour is of the form 0x00RRGGBB. Note: Adding 0x20 to alpha each
* time will only work for 7 overlapping circles. */
重複円の色は、基礎となるものを支配するだろうが、それらは、少なくともプレーヤーが正しくすべてのサークルを見ることができるであろう重なる場合、アルファはより不透明になります。
正確なカラーブレンドを行う場合は、計算がずっと複雑になります。特に、アルファと1つの値をアルファとブレンドする場合は、各ピクセルのカラー寄与はアルファの割合各色。それは不可能ではありませんが、それを効率的にすることは苦痛です。私は安い選択肢に行くように誘惑されるだろう。
出典
2009-08-03 09:12:44
izb
素晴らしいアイデア、ありがとう!私はデバイスがそのようなアプローチを扱うことができるかどうかをテストするためにサンプルコードを書いていきます。 –