| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1844 人关注过本帖
标题:问一个AlphaBlend的问题
只看楼主 加入收藏
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
结帖率:96.15%
收藏
已结贴  问题点数:50 回复次数:14 
问一个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
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:12 
这么简单一个函数,性能上怎么会有问题?难道要被频繁调用吗?
把你用MMX写的代码发上来看看

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2010-10-24 15:52
御坂美琴
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
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:12 
//(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)

2010-10-24 16:53
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
如果用MMX肯定比C要快不少
既然是频繁调用,最好能一次多处理几组数据,也好发挥MMX并行计算的作用,比如改成数组形式批量计算:
COLORREF *
GetAlphaBlendColor(COLORREF cDest[], COLORREF cSrc[], COLORREF alpha[]);

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2010-10-24 17:00
御坂美琴
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
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
表遮遮掩掩的,把你的MMX代码发出来俺瞧瞧,晚饭时间快到了,俺要出去觅食了

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2010-10-24 17:28
御坂美琴
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
快速回复:问一个AlphaBlend的问题
数据加载中...
 
   



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

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