急救!如何提高 AlphaBlend 函数的执行速度?

七伤拳 2002-11-04 10:59:15
我现在用 Alpha 通道逐点贴图画一条带透明效果的线条,但是速度很慢,鼠标拖动时绘图明显画线跟不上鼠标移动速度。

请问要如何才能提高速度?我想此函数的实现应该已经经过优化了的,为什么还会这么慢?有没有替代的方法?
...全文
129 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
s6283 2002-11-04
  • 打赏
  • 举报
回复
MMX
七伤拳 2002-11-04
  • 打赏
  • 举报
回复
要在WIN98下面运行的,不能用GDI+
kingcom 2002-11-04
  • 打赏
  • 举报
回复
用GDI+行不行???我记得GDI+里面很多都有一个alpha参数...
七伤拳 2002-11-04
  • 打赏
  • 举报
回复
现在就是用 AlphaBlend 函数,结合 LineDDA 画线,结果线宽一大就不行了,速度很慢。
harry202 2002-11-04
  • 打赏
  • 举报
回复
另外,如果你只是一条线,那计算量应该不大,可以考虑使用WINAPI AlphaBlend函数替代。
harry202 2002-11-04
  • 打赏
  • 举报
回复
目前在wintel结构下,最快的alpha混合方法是使用intel提供的汇编算法。
你可以去intel.com查找“Instructions to Implement Alpha Blending“
有源代码。不过如果你的汇编功力不足,用在vc里面比较麻烦。
harry202 2002-11-04
  • 打赏
  • 举报
回复
还有一个折衷的办法,但是只能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);
---------------------
harry202 2002-11-04
  • 打赏
  • 举报
回复
GDI+速度比GDI慢1个数量级。
Intel的代码就使用了mmx指令

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧