我现在用 Alpha 通道逐点贴图画一条带透明效果的线条,但是速度很慢,鼠标拖动时绘图明显画线跟不上鼠标移动速度。请问要如何才能提高速度?我想此函数的实现应该已经经过优化了的,为什么还会这么慢?有没有替代的方法?

解决方案 »

  1.   

    目前在wintel结构下,最快的alpha混合方法是使用intel提供的汇编算法。
    你可以去intel.com查找“Instructions to Implement Alpha Blending“
    有源代码。不过如果你的汇编功力不足,用在vc里面比较麻烦。
      

  2.   

    另外,如果你只是一条线,那计算量应该不大,可以考虑使用WINAPI AlphaBlend函数替代。
      

  3.   

    现在就是用 AlphaBlend 函数,结合 LineDDA 画线,结果线宽一大就不行了,速度很慢。
      

  4.   

    用GDI+行不行???我记得GDI+里面很多都有一个alpha参数...
      

  5.   

    要在WIN98下面运行的,不能用GDI+
      

  6.   

    GDI+速度比GDI慢1个数量级。
    Intel的代码就使用了mmx指令
      

  7.   

    还有一个折衷的办法,但是只能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);
    ---------------------