急救!如何提高 AlphaBlend 函数的执行速度? 我现在用 Alpha 通道逐点贴图画一条带透明效果的线条,但是速度很慢,鼠标拖动时绘图明显画线跟不上鼠标移动速度。请问要如何才能提高速度?我想此函数的实现应该已经经过优化了的,为什么还会这么慢?有没有替代的方法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 目前在wintel结构下,最快的alpha混合方法是使用intel提供的汇编算法。你可以去intel.com查找“Instructions to Implement Alpha Blending“有源代码。不过如果你的汇编功力不足,用在vc里面比较麻烦。 另外,如果你只是一条线,那计算量应该不大,可以考虑使用WINAPI AlphaBlend函数替代。 现在就是用 AlphaBlend 函数,结合 LineDDA 画线,结果线宽一大就不行了,速度很慢。 用GDI+行不行???我记得GDI+里面很多都有一个alpha参数... 要在WIN98下面运行的,不能用GDI+ GDI+速度比GDI慢1个数量级。Intel的代码就使用了mmx指令 还有一个折衷的办法,但是只能50%透明,且只能用在纯色填充的对象上。方法是使用棋盘网格画刷,这样一个像素透明,一个像素不透明,就有了半透明的效果(利用了人眼的视觉误差),看起来就像薄纱。这个办法速度很快。代码如下: int nsave = dc.SaveDC(); const unsigned short ChessBoard[] = {0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55}; HBITMAP hBitmap = CreateBitmap(8,8,1,1,ChessBoard); HBRUSH hBrush = CreatePatternBrush(hBitmap); DeleteObject(hBitmap); HGDIOBJ hOldBrush = SelectObject(dc.m_hDC,hBrush); HGDIOBJ hOldPen = SelectObject(dc.m_hDC,GetStockObject(NULL_PEN)); dc.SetROP2(R2_MASKPEN); dc.SetBkColor(RGB(255,255,255)); dc.SetTextColor(RGB(0,0,0)); dc.Rectangle(yourRect);//你的线条矩形 dc.SetROP2(R2_MERGEPEN); dc.SetBkColor(RGB(0,0,0)); dc.SetTextColor(m_backColor);//线条颜色 dc.Rectangle(yourRect); SelectObject(dc.m_hDC,hOldBrush); SelectObject(dc.m_hDC,hOldPen); DeleteObject(hBrush); dc.RestoreDC(nsave);--------------------- (讨论帖)CPU占用率 请问哪位知道在listbox 中加入可编辑combox? MDI程序,连接数据库的问题. 招聘C++程序员 后天去面试~ 还不知道公司怎么样~ 很奇怪的socket问题,错误代码:WSAECONNRESET (10054) 有谁看过 myicqd(服务器端) 源代码的,进来聊聊 1.VC中的文档模版类相当于java 中面板类吗? 2.MFC向导后文档模版类怎放入多个视类? 关于ListBox,继续求助啊 游戏编程的程序员好找工作吗?我越来越喜欢游戏编程了! 大家来总结一下数据类型转换的方法,好不好? 高人,HELP! --(属性页内子窗口的排序)
你可以去intel.com查找“Instructions to Implement Alpha Blending“
有源代码。不过如果你的汇编功力不足,用在vc里面比较麻烦。
Intel的代码就使用了mmx指令
方法是使用棋盘网格画刷,这样一个像素透明,一个像素不透明,就有了半透明的效果(利用了人眼的视觉误差),看起来就像薄纱。这个办法速度很快。
代码如下:
int nsave = dc.SaveDC();
const unsigned short ChessBoard[] = {0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55};
HBITMAP hBitmap = CreateBitmap(8,8,1,1,ChessBoard);
HBRUSH hBrush = CreatePatternBrush(hBitmap);
DeleteObject(hBitmap);
HGDIOBJ hOldBrush = SelectObject(dc.m_hDC,hBrush);
HGDIOBJ hOldPen = SelectObject(dc.m_hDC,GetStockObject(NULL_PEN));
dc.SetROP2(R2_MASKPEN);
dc.SetBkColor(RGB(255,255,255));
dc.SetTextColor(RGB(0,0,0));
dc.Rectangle(yourRect);//你的线条矩形
dc.SetROP2(R2_MERGEPEN);
dc.SetBkColor(RGB(0,0,0));
dc.SetTextColor(m_backColor);//线条颜色
dc.Rectangle(yourRect);
SelectObject(dc.m_hDC,hOldBrush);
SelectObject(dc.m_hDC,hOldPen);
DeleteObject(hBrush);
dc.RestoreDC(nsave);
---------------------