当我绘制大量(~10k)简单基元时,为什么GDI会变得无法响应?

时间:2016-02-07 10:48:45

标签: c++ winapi mfc gdi

我有一个带有经典Doc / View架构的MFC应用程序。作为性能测试,我实现了非常简单的绘制过程,绘制弧并将这些弧存储在该应用程序的文档中。

struct CArc
{
    CRect rectClient;
};

问题在于,当我达到10k这些非常简单的原语时,程序就会变得无法响应。对于GDI和这么多原语来说这是正常的还是我做错了什么?

void CUndo_RedoView::OnDraw(CDC* pDC)
{
    pDoc_ = GetDocument();
    ASSERT_VALID(pDoc_);
    if (!pDoc_)
        return;
    for (const auto& x : pDoc_->arcs_)//arcs_ is a vector<CArc>
    {
        pDC->Arc(x.rectClient,
            CPoint(x.rectClient.right, x.rectClient.CenterPoint().y),
            CPoint(x.rectClient.CenterPoint().x, x.rectClient.right));
    }
    // TODO: add draw code for native data here

}

1 个答案:

答案 0 :(得分:0)

GDI很慢。

首选方法是使用内存DC,如MFC的CMemDC(https://msdn.microsoft.com/en-us/library/cc308997(v=vs.90).aspx),只有在实际修改图像时才能渲染图像。然后BitBlt你下一次OnPaint调用中的缓存图像

如果您仍遇到性能问题,请考虑查看GDI +或DirectX