光线衰减的 MMX 优化


在即将发布的风魂 0.14中, 最大的改进将是光线运算变快了. (关于其全屏运算光线技术, 请参考2D 游戏中的光照) 这得益于 MMX 技术的运用.

使用 MMX 做 16bit 颜色的 Alpha 混合运算, 按 Intel 的官方算法, 能获得很好的效果. (至于云风提出的异类算法, 仅适合更高速的实现单一 Alpha 值做透明处理等) 如果我们引申到光线处理中, 也可以大幅度的提高速度.

Intel 的方法很简单, 就是将相邻 4 个点的 RGB 分离到 3 个 MMX 寄存器, 然后使用 MMX 乘法分别做混合. 分离代码如下:

	movq mm0,[esi]
	movq mm1,mm0
	movq mm2,mm0
	pand mm0,red_mask
	pand mm1,green_mask
	pand mm2,blue_mask
btw, 其中红色部分在算乘法前由于进位关系, 还需要再做一次右移.

我们在使用时, 由于 MMX 乘法是 16bit x 16bit 的, 所以还需要将亮度数据从 8bit 扩展到 16bit. 风魂中是每相邻两点的亮度相同, 所以我们只需要建一张 32x32x8 bytes 的表, 查表就可以将其转换; 如果是做逐点光线运算, 则应该使用 PUNPCKL.

我们分别乘完了每个色素后, 再将三个色素用 por 合在一起.

具体的代码, 请参考即将发布的风魂 0.14 的 light 部分, 根云风测试, 合成整个屏幕的光线, 速度能有 80% 的提高哟 ;-)