gpt4 book ai didi

.net - 在 .NET 中创建 Font 对象的成本

转载 作者:行者123 更新时间:2023-12-02 15:42:48 25 4
gpt4 key购买 nike

在我正在开发的应用程序中,我们使用 DevExpress XtraGrid 控件,该控件具有一个 RowCellStyle 事件,允许自定义每个单元格的样式。此事件的事件处理程序通常如下所示:

private gridView1_RowCellStyle(object sender, RowCellStyleEventArgs e)
{
if (/* Some condition */)
{
e.Appearance.Font = new Font(gridView1.Appearance.Font, FontStyle.Bold);
}
}

每次渲染单元格时都会调用此处理程序,因此它可以创建大量 Font 实例。所以我想知道这样做的成本......我做了一些实验,似乎每次都会创建一个新的 HFONT 句柄。我应该担心吗?对资源使用的影响有多大?

如果它对性能有显着影响,是否应该有一个 FontCache 类或类似的东西?

注意:我知道如何解决这个问题(我只需要创建一次字体并每次重复使用它),我的问题实际上是关于创建许多 HFONT 句柄的成本

最佳答案

测试一下;通过重用,我获得了双倍的性能(在发布中,重用 = 3000 毫秒,重新创建 = 4900 毫秒)

using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;
static class Program
{
static void Main()
{
Button btn1, btn2;
Form form = new Form
{
Controls = {
(btn1 = new Button { Dock = DockStyle.Bottom, Text = "reuse" }),
(btn2 = new Button { Dock = DockStyle.Bottom, Text = "recreate"})
}
};
btn1.Click += delegate
{
var watch = Stopwatch.StartNew();
using (var gfx = form.CreateGraphics())
using (var font = new Font(SystemFonts.DefaultFont, FontStyle.Bold))
{
gfx.Clear(SystemColors.Control);
for (int i = 0; i < 10000; i++)
{
gfx.DrawString("abc", font, SystemBrushes.ControlText, i % 103, i % 152);
}
}
watch.Stop();
form.Text = watch.ElapsedMilliseconds + "ms";
};
btn2.Click += delegate
{
var watch = Stopwatch.StartNew();
using (var gfx = form.CreateGraphics())
{
gfx.Clear(SystemColors.Control);
for (int i = 0; i < 10000; i++)
{
using (var font = new Font(SystemFonts.DefaultFont, FontStyle.Bold))
{
gfx.DrawString("abc", font, SystemBrushes.ControlText, i % 103, i % 152);
}
}
}
watch.Stop();
form.Text = watch.ElapsedMilliseconds + "ms";
};
Application.Run(form);

}
}

关于.net - 在 .NET 中创建 Font 对象的成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1785888/

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