gpt4 book ai didi

c# - 哪些 System.Drawing 类算作 GDI 对象?

转载 作者:可可西里 更新时间:2023-11-01 08:50:06 26 4
gpt4 key购买 nike

我一直难以理解 System.Drawing 命名空间中的哪些确切对象实际上对系统总 GDI 对象计数有贡献。例如,Matrix 对象算不算? 图形路径?

为了对此进行测试,我在 Form 初始化时运行了以下代码。

public partial class Form1 : Form
{
Timer timer = new Timer();
List<Pen> pens = new List<Pen>();

public Form1()
{
InitializeComponent();

var r = new Random();
for (int i = 0; i < 1000; i++)
{
var p = new Pen(
Color.FromArgb(r.Next(255), r.Next(255), r.Next(255)),
(float)r.NextDouble() * 10);
pens.Add(p);
}

timer.Interval = 30;
timer.Tick += timer_Tick;
timer.Start();
}

void timer_Tick(object sender, EventArgs e)
{
panel1.Invalidate();
}

private void panel1_Paint(object sender, PaintEventArgs e)
{
for (int i = 0; i < pens.Count; i++)
{
e.Graphics.DrawLine(pens[i], (int)(20 + i * 0.1), 20, (int)(50 + i * 0.1), 50);
}
}
}

我惊讶地发现我的应用程序 GDI 对象计数是 32(使用任务管理器 > 详细信息 > GDI 对象列测量)。即使我保留列表并强制 Paint 事件使用生成的每支笔绘制单独的线条,情况也是如此。我什至尝试创建随机颜色以确保没有任何东西被重复使用,并且 GDI 计数仍然稳定在 32。

有很多帖子担心缓存和重用 Pen 实例和其他对象,但我不清楚是否所有 System.Drawing 对象都对此有贡献数数。

也许现代 GDI+ 实现实际上是惰性的,并且仅在您实际绘制某些东西时才延迟分配?

更新: GSerg指出MSDN official documentation

When you use GDI+, you don't have to be as concerned with handles and device contexts as you do when you use GDI.

GDI+ 似乎对 GDI 句柄进行了抽象,并尽可能避免使用它们。这也与报告一致 elsewhere这似乎表明 GDI+ 仅在绝对必要时才实际创建 GDI 句柄。例如,如果您调用需要存在句柄的方法,则 Bitmap 仅由句柄支持,例如GetHBitmap().

看来,至少在现代 GDI+ 中,PenBrush 和许多其他 System.Drawing 对象实际上并没有对GDI 对象总数。当然,在 C# 中,如果未释放它们,它们仍然会泄漏非托管内存,因为它们由非托管 GDI+ 对象支持,但 native 内存不像 GDI 内存那样苛刻。

如果当前的解释没有争议,我将在接下来的几天内将其移至答案。

最佳答案

以下对象导致创建 GDI 句柄:

  • 位图
  • 画笔
  • 直流
  • 增强型图元文件
  • 增强型图元文件 DC
  • 字体
  • 内存直流
  • 图元文件
  • 图元文件 DC
  • 调色板
  • 加长笔
  • 地区

此列表是使用此处的信息制定的: https://learn.microsoft.com/en-gb/windows/desktop/SysInfo/gdi-objects

关于c# - 哪些 System.Drawing 类算作 GDI 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49940530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com