2011-01-21 9 views
0

を使用して((a >> 24)*(b >> 24))>> 8)< < 24;ブレンドアルファ色Iは、ARGB形式のアルファ色をブレンドするには、以下のコードを有するビット演算

それを最適化する方法はありますか?

ありがとうございます!

+0

たもの>と<ことになっ>>と<<ですか? –

+0

どのような言語ですか? –

+0

質問にいくつか間違いがありましたが、修正されました。ありがとう。どんな言語でも問題ありません。それを最適化するためのちょっとしたアイデアが必要です。 :) – echo

答えて

1

アルファブレンディングは実行されません。これは、2つのピクセルのアルファ成分を組み合わせるだけです。それはおそらく、アセンブリに直接行かなくても得られるほど効率的です。あなたはポインタを使用できる場合は、しかし、少し速くなるかもしれない:これは、移動のほとんどを保存し

byte* pa = (byte*)&a; 
byte* pb = (byte*)&b; 
byte* po = (byte*)&o; 

po[3] = pa[3] * pb[3] >> 8; 

。これはリトルエンディアンマシンを前提としています。あなたはビッグエンディアンのプロセッサ上で実行している場合、それはさらに良くして次のようになります。いずれの場合も

*po = *pa * *pb >> 8; 

は、あなたがすべてのポインタのキャストをインラインで行うことでワンライナーにこれを回すことができますが、それ読むのが少し難しい。

((byte*)&o)[3] = ((byte*)&a)[3] * ((byte*)&b)[3] >> 8; 

または

*((byte*)&o) = *((byte*)&a) * *((byte*)&b) >> 8; 
+0

私はポインタがないことを意味し、ビット単位の操作を最適化するだけです。 – echo

+0

私が言ったように、それ以上のことはできませんが、アセンブリで数クロックを節約することができます。しかし、このコードがボトルネックだと思うのはなぜですか?プロファイリングしましたか?私が言ったように、これはブレンド操作全体を実行するものではありません。そのコードは、およそ3回です。 –

+0

これを確認してください。実際には6回。 –

0
unsigned int blend(unsigned int a, unsigned int b) 
{ 
    return (((a >> 24) * (b >> 24)) << 16) & 0xFF000000; 
} 

これはあなたがやろうとしていることですか?私はこれがどんなに速いとは思わないが、あなたが言ったことに従ってより正確になる。

ビット演算子を使用する必要がない場合は、他のソリューションで示されているように、ポインタも使用できます。

+0

よく、私は例を挙げるべきです。 a = 0x01808080、b = 0x02808080、oは0x02000000である必要があります。そうすれば| 0x00FFFFFF、それは正しくありません。また、<< 16は>> 24と等しくなく、<< 8. – echo

+0

>> 8と等しくなります。これはあなたのコードが示すものです。 –

+0

(a >> 24)*(b >> 24)= 0x2010と考えると、>> 8は0x20に、<< 24は0x20000000にします。しかし、<< 16では0x20100000になります。 – echo

関連する問題