关于16位色在arm cpu上的快速alpha算法
来源:互联网 发布:科脉餐饮软件 编辑:程序博客网 时间:2024/06/05 20:41
最近在优化一个小程序,其中涉及到了alpha混合的代码,如果是在
台式机上可以通过mmx指令来加速,但是在arm cpu上mmx指令并不普及,所以
采用了一个小技巧来做这个alpha的优化。
台式机上可以通过mmx指令来加速,但是在arm cpu上mmx指令并不普及,所以
采用了一个小技巧来做这个alpha的优化。
alpha混合其实很简单,要做的只是分解源颜色c1,目的颜色c2,然后将颜色分
量r1,g1,b1和r2,g2,b2分别按照公式(clr*alpha+clr*(32-alpha))/32来计算,
最后再组合成一个颜色值即可,可是如此计算,运算量很大速度很慢。
所以现在就要用到一个技巧,首先,就16位色来说一般的格式是565,表示rgb
分量的二进制位数,如图1。
那么我们就可以利用一个32位的变量来把这个颜色的绿色分量提前,变为如图2的格式。
这样每个颜色分量中间就有了进位的空间,也就不用分解这个颜色值了。
然后,将变形完的两个颜色值按照上面公式进行计算,计算完毕再变回565的格式
就完成了一次alpha混合的计算。
c语言源代码如下:
- __inline void MakeAlpha(WORD* wpSrc, WORD* wpDes, WORD wAlpha)
- {
- register DWORD d1; // 计算用的中间变量,声明为寄存器变量快些
- register WORD wa = *wpSrc; // 源颜色
- register WORD wb = *wpDes; // 目的颜色
- register DWORD alpha = wAlpha; // alpha值,16位色的色深为32级,
- //故alpha取值0-32
- // (c1-c2)*alpha/32+c2 由(c1*alpha+c2*(32-alpha))/32变形
- // 而来,减少了一次乘法运算
- // 下面的式子故意写成这样,编译器会把它处理的很好
- // 要比这样快一些
- // c1 = (((wa << 16) | wa) & 0x7e0f81f);
- // 16位变形32位 0x7e...f为二进制的00000111111000001111100000011111
- // c2 = (((wb << 16) | wb) & 0x7e0f81f);
- // d1 = ((c1-c2)*alpha)>>5+c2;
- // 除以32等于右移5位,但是位移操作要比乘除法快的多,
- // 例如:a*320可以写成a*256+a*64=>(a<<8)+(a<<6)
- d1 = (((((((wa << 16) | wa) & 0x7e0f81f) - (((wb << 16) | wb) & 0x7e0f81f)) * alpha) >> 5) + (((wb << 16) | wb) & 0x7e0f81f)) & 0x7e0f81f;
- wa = (d1 & 0xffff0000)>>16; // g...r...b => ..g..
- wb = d1 & 0xffff; // g...r...b => r...b
- *wpDes = wa | wb; // rgb
- }
我们用C语言写出来的乘法,编译器只能做部分优化,生成的汇编是由一些移位相加的循环组成的;有时数组元素的寻址也类似这样,所以除了用汇编改写之外也都有这样的优化空间。这个方法可以取得和汇编接近的计算效率,且和CPU无关,便于移植。
原文地址 http://blog.pdafans.com/?72643/viewspace-1056.html
- 关于16位色在arm cpu上的快速alpha算法
- 关于16位色在arm cpu上的快速alpha算法
- 16位CFbsBitmap上的快速Alpha算法
- 16位Alpha混合的简单算法
- 16位Alpha混合的简单算法——转载
- 在ARM上的快速AlphaBlend算法解析。透明框体实现。
- 64K 色模式下的快速 Alpha混合算法
- 关于linux在arm上的移植
- mobile cpu上禁用alpha test的相关总结
- 常用数据类型在32位和64位CPU上的字节数比较
- 16位Alpha混合的MMX优化
- 关于DM9000在ARM总线上的地址
- ftp(vsftp) 在Cortex-A9 ARM CPU s5p4418上的移植
- 一个快速的8级ALPHA混合算法
- 关于位的算法
- 基于ARM在cpu上做神经网络加速
- 在Intel 64EMT CPU上的VMware安装64位系统的问题
- 在Windows 7 的64位系统上,安装tensorflow 的CPU版本
- Webservice,基于Axis的最佳实践。
- STATSPACK and AWR Statistics Comparison
- 盖茨给IT职场新人的10句话
- 诚信缺失 中关村传统电脑卖场面临“崩盘”?(转载搜狐)
- 微软面试题,查找1的个数
- 关于16位色在arm cpu上的快速alpha算法
- mysql_connect和mysql_pconnect区别
- 模态对话框与非模态对话框 的区别
- 探寻成功之路 企业共同关心
- 突破C#.net上传4M的限制 web.config配置
- Posix线程编程指南(2)——线程私有数据
- 如何生成孤儿进程
- static和const的比较和解释
- 第二部分:OLE数据传输(OLE Drag和Drop随笔)