Win API 中的内存 DC 有多便宜/贵?

joh*_*und 2 c c++ winapi dib

我正在开发一个程序,该程序将有许多 DIB 位图(由 创建CreateDIBSection),并且必须使用 Win API 在它们上绘制大量文本。

为了在位图上绘图,Windows 需要由CreateCompatibleDC.

现在有两种方法:

  1. 我可以为每个位图创建一次 DC,用它来绘制并在释放位图时将其删除。

  2. 或者,只有当我需要绘制位图、调用绘制函数并删除 DC 时,我才可以创建 DC。

更好的方法是什么?我更喜欢第一个,因为调用较少 - 这将使我的代码更小并且速度更快一些。

但是为每个位图持有一个长期存在的 DC 是不是太昂贵了?

Edit1:该应用程序实际上是一个 GUI 工具包库,将来可以以不同且不可预测的方式使用,因此我需要一个平衡的决策,以实现最大可能的性能和最小的系统资源使用。

IIn*_*ble 5

每个进程和每个会话的GDI 对象都是有限的。您正在与同一会话中运行的所有其他进程竞争资源。考虑到这一点,您应该仅在需要时才使用 GDI 资源(问题中的选项 2)。

\n

Mark Russinovich 的博客文章突破 Windows 的极限:USER 和 GDI 对象 \xe2\x80\x93 第 2 部分介绍了相当多的细节。总而言之,下面列出了窗口管理器对 GDI 资源设置的限制:

\n
    \n
  • 每个进程 10.000 个 GDI 对象(默认值,可通过注册表项HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\GDIProcessHandleQuota进行配置)。
  • \n
  • 每个用户会话 65.535 个 GDI 对象。
  • \n
  • GDI 对象内存限制是分页池限制(请参阅推动 Windows 的限制:分页和非分页池)。
  • \n
\n