を使用して((a >> 24)*(b >> 24))>> 8)< < 24;ブレンドアルファ色Iは、ARGB形式のアルファ色をブレンドするには、以下のコードを有するビット演算
それを最適化する方法はありますか?
ありがとうございます!
を使用して((a >> 24)*(b >> 24))>> 8)< < 24;ブレンドアルファ色Iは、ARGB形式のアルファ色をブレンドするには、以下のコードを有するビット演算
それを最適化する方法はありますか?
ありがとうございます!
アルファブレンディングは実行されません。これは、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;
私はポインタがないことを意味し、ビット単位の操作を最適化するだけです。 – echo
私が言ったように、それ以上のことはできませんが、アセンブリで数クロックを節約することができます。しかし、このコードがボトルネックだと思うのはなぜですか?プロファイリングしましたか?私が言ったように、これはブレンド操作全体を実行するものではありません。そのコードは、およそ3回です。 –
これを確認してください。実際には6回。 –
unsigned int blend(unsigned int a, unsigned int b)
{
return (((a >> 24) * (b >> 24)) << 16) & 0xFF000000;
}
これはあなたがやろうとしていることですか?私はこれがどんなに速いとは思わないが、あなたが言ったことに従ってより正確になる。
ビット演算子を使用する必要がない場合は、他のソリューションで示されているように、ポインタも使用できます。
たもの>と<ことになっ>>と<<ですか? –
どのような言語ですか? –
質問にいくつか間違いがありましたが、修正されました。ありがとう。どんな言語でも問題ありません。それを最適化するためのちょっとしたアイデアが必要です。 :) – echo