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

Why does GDI become unresponsive when I draw a large number (~10k) of simple primitives?

本文关键字:GDI 响应 简单 绘制 10k 为什么      更新时间:2023-10-16

我有一个具有经典文档/视图架构的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
}

GDI很慢。

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

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