我有下面的代码来混合ARGB格式的alpha颜色:
a,b,o是整数,但应该总是落在[0x00ffffff,0xffffffff]
o =(((a>> 24)*(b>> 24))>>><<< 24;
有没有优化它?
谢谢!
答案 0 :(得分:1)
那不执行alpha混合。这只是组合了两个像素的alpha分量。它也可能与你没有直接进行组装时的效率一样高效。如果你可以使用指针,你可能会更快一点:
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;
答案 1 :(得分:0)
unsigned int blend(unsigned int a, unsigned int b)
{
return (((a >> 24) * (b >> 24)) << 16) & 0xFF000000;
}
这是你想要做的吗?我认为这不会更快,但根据你所说的更准确。
如果您不需要使用按位运算符,也可以使用指针,如其他解决方案所示。