时隔3年,忽然想起还有这么一个没填完的坑,已从事智能机游戏的开发,趁还没忘光之前,把曾经的闪光点记录下来
上次写到半透明混合的优化,由于半透明混合优化的效果较好,就想把这个扩展到更高精度的alpha混合方式
有了前两次优化的积淀,显然我是不会采取这种方式的
r = r1 * alpha / 256 + r2 * (256 - alpha) / 256
g = g1 * alpha / 256 + g2 * (256 - alpha) / 256
b = b1 * alpha / 256 + b2 * (256 - alpha) / 256
仍然是要减少循环内的运算量,直接用RGB内存位表示运算过程:
expand操作:
rrrr, rggg, gggb, bbbb
==>>舍弃一位g值,取555精度
0000, 00r, rrrr, 0000, 0ggg, gg00, 000b, bbbb
此时实际上提供了32级精度alpha的可能性
((expand(color1) * alpha) >>1) + ((expand(color2) * (32 - alpha) >> 1)
再取出这个范围的rgb值作为目标点的色值,即可
00rr, rrr0, 0000, gggg, g000, 00bb, bbb0, 0000
这个优化把循环内的6次乘法(6次除以256实际上会被编译器优化为移位),减少到了两次
如果加上《扩展图形函数2》中循环的优化,初步估计要比未优化的版本的效率提高10倍,在功能机上多用几个alpha通道就卡成一坨屎的情况已经不复存在了