我有两种颜色,我使用这种方法进行简单的alpha混合:
int Color::blend(int col1, int col2)
{
float a1 = ((col1 & 0x000000FF) / 255.0);
return ((int)((((col1 & 0xFF000000) >> 24) * a1) + (((col2 & 0xFF000000) >> 24) * (1.0 - a1)))) << 24 |
((int)((((col1 & 0x00FF0000) >> 16) * a1) + (((col2 & 0x00FF0000) >> 16) * (1.0 - a1)))) << 16 |
((int)((((col1 & 0x0000FF00) >> 8 ) * a1) + (((col2 & 0x0000FF00) >> 8 ) * (1.0 - a1)))) << 8 | 255;
}
(颜色为RGBA8888格式)
这有效,但我想知道:这是最快的方式,还是更有效率?
答案 0 :(得分:1)
您可以通过将a1 *(2 ^ 24)表示为整数,以整数运算,然后将结果向下移位24位来提高性能。在现代架构上,我怀疑它会给你带来多少收获。如果你想要更好的性能,你真的需要进行SIMD操作。
哦,有一点:你应该将a1的计算表达为a1 = ((col1 & 0x000000FF) * (1.0 / 255.0))
。这样可以避免昂贵的FP部门。 (由于潜在的精度损失,编译器通常不会自己做到这一点。)