自从今年 3 月云风开始使用 pentium 200mmx cpu 后, 一直在考虑如何用 mmx 技术加快 alpha 混合的操作, 尤其是针对目前常用的高彩模式. 而早先在国外一个有关游戏编程的 maillist 讨论的结果是 mmx 不利于对 16位色进行 alpha 混合操作. 让我们先来看看 mmx 技术相对于普通指令集的更新,来了解一下这个论点的立论.
但是它也有诸多不足, 比如算术指令不能对四字节字操作; 指令结构都不影响标志位; 不能对常数立即寻址; mmx 系统指令集的指令相当贫乏(连 not 操作也不能直接实现); 【程序编程相关:日期值的计算】
mmx 技术的优势在于, 它的寄存器是 64 位的, 而提供了分组模式, 可以将寄存器内的数据按 8 个字节, 或 4 个字, 或 2 个双字同时进行同一操作, 方便了大数据量的数据处理; 可以成组数据同时作比较操作, 这为透明色点的批量判断带来好处; mmx 的 cpu 拥有 8 个 mmx 寄存器, 在一定程度上缓解了 80x86 cpu 寄存器数量不足的缺陷. 【推荐阅读:日期控件】
而 16bit 色, 红绿蓝各占 5 或 6 位, 难以被分组分开, 所以不利于运用 mmx 的这些特性. 当然另外的解决方法是采用 argb 4444 的结构, 其中 4 位是 alpha 通道, 每个色素占半个字节, 再采用类似的方法. 【扩展信息:VB.net入门(10):补充:类~属性】
当颜色深度是 24/32 位时, rgb 都占 8 位, 这样可以巧妙的利用 mmx 里的分组乘法指令达到做 alpha 混合运算的效果(mmx 的乘法相关指令只有对字操作的 pmulhw/pmullw 两条, 分别是成组数据的乘后取高位与取低位) 本文旨在探讨 16bit 色的快速 alpha 混合运算, 所以此处略去不提.
看过云风去年提出的16bit alpha 混合优化算法的朋友, 应该会联想到这个算法向 mmx 的引申, ok, 也许你已经明白了大概, 本文的理论基本点就在此, 唯一的问题是, 我们需要面对的是 mmx 指令集的种种缺陷, 这些在实际的程序设计中会逐步的体现出来, 下面, 云风将在介绍算法的同时, 附带的提出一些运用 mmx 的技巧(随后将有专文介绍 mmx 编程技术)
先来看看上次的算法有无可进一步优化的可能:
16bit 下 alpha 混合的关键在于如何将 rgb 分离, 让随后的乘法结果不至于相互干扰.
... 下一页