标题:问一个AlphaBlend的问题
取消只看楼主
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
结帖率:96.15%
已结贴  问题点数:50 回复次数:6 
问一个AlphaBlend的问题
想求个高人,用 C/C++/内联汇编 完成这样一个函数(要在VC 6/2008上编译通过):
COLORREF
GetAlphaBlendColor(COLORREF cDest, COLORREF cSrc, COLORREF alpha);

我对汇编优化什么的不熟悉,所以求个代码,速度尽可能快。。。

数据格式是这样的COLORREF 是一个int32,低24位里,每8位保存了一个颜色分量,然后要对每一个分量做以下运算:
ret = (dest * (0xFF - alpha) + src * alpha) / 0x100;

alpha的范围是0 - 0xFF之间

最后要返回运算的结果,这样。。。嗯。。纠结了这个问题上了
虽然我用MMX写过一下,但速度仍然不满意,所以就发上来问一下了
给最佳答案单独送50分
搜索更多相关主题的帖子: AlphaBlend 
2010-10-23 11:41
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
得分:0 
呃。。。。这个问题很难?还是偶描述的不够清楚。。。帮个忙呀

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-10-24 15:28
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
得分:0 
调用次数极多,但我不是指这个函数本身的性能足不足够的问题,我是希望汇编的代码能运行得比C代码要快

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-10-24 16:01
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
得分:0 
以下是引用VxWorks在2010-10-24 17:00:34的发言:

如果用MMX肯定比C要快不少
既然是频繁调用,最好能一次多处理几组数据,也好发挥MMX并行计算的作用,比如改成数组形式批量计算:
COLORREF *
GetAlphaBlendColor(COLORREF cDest[], COLORREF cSrc[], COLORREF alpha[]);

我的结果是相反,MMX比C代码还慢

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-10-24 17:14
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
得分:0 
以下是引用yu_hua在2010-10-24 16:53:55的发言:

//(dest * (0xFF - alpha) + src * alpha) / 0x100;
_asm  SUB EAX, EAX
_asm  MOV AL, alpha
_asm  MOV EDI, src ; 取 src 的偏移地址
_asm  MUL Qword ptr [EDI]
_asm  PUSH EAX
_asm  SUB EAX, EAX
_asm  MOV AL, alpha
_asm  NOT AL ; 取反,即AL=0xff-AL
_asm  MOV EDI, dest ; 取 dest 的偏移地址
_asm  MUL Qword ptr [EDI]
_asm  POP EDX
_asm  ADD EAX,EDX ; 此处假设不发生进位
_asm  SHR EAX,8 ; 逻辑右移8位相当于/0x100
//至此返回值在 EAX 中(高8位均为0)



不对,这位先看看alphablend吧,是三个8位分别这样运算,不是只计算一次

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-10-24 17:15
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
得分:0 
src是cSrc
dst是cDst
_asm
{
        //Initialize
        mov eax, alpha
        shl eax, 24

        pxor mm7, mm7
        movd mm0, eax
        punpcklbw mm0,mm7
        mov ebx, 0xFFFFFFFF //255-Alpha mask
        punpckhwd mm0,mm0
        movd mm1, ebx
        punpcklbw mm1,mm7
        movd mm2, src
        punpckhdq mm0,mm0 //mm0=unpacked src alpha bit
        movd mm3, dst

        punpcklbw mm2, mm7
        psubb mm1,mm0     //mm1=255-src alpha bit
        punpcklbw mm3, mm7
        pmullw mm2,mm0    //mm2=src*srcAlpha
        pmullw mm3,mm1    //mm3=dst*(255-srcAlpha)
        paddusw mm3,mm2   //mm3=src*srcAlpha+dst*(255-srcAlpha)
        psrlw mm3,8       //mm3=src*srcAlpha/256+dst*(255-srcAlpha)/256
        packuswb mm3,mm7  //mm3=packed dst
        movd eax,mm3

        //finally
        emms
}

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-10-24 17:31
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
得分:0 
嘛。。。整块计算的MMX很容易搜索到,但单个像素的,要比C版本快的MMX似乎找不着。。。。

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-10-27 23:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-323742-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.092979 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved