【发布时间】:2011-04-13 16:52:05
【问题描述】:
我经常使用 Visual Studio 2008、.NET C# 2.0-3.5 和 Windows 窗体,并且我注意到,像我之前的许多人一样,GDI+ 在绘制控件时非常慢。 注意,我不太会处理图片(JPG、GIF 等)。图像仅在某些地方作为图标。这实际上是绘制缓慢的控件/表单/等。
问题是您可以看到正在绘制的控件,并且可能需要几秒钟才能绘制一组看似简单的控件。即,它的滞后和可怕。
我已经进行了测试,我只是在一个表单上放置了一些标签 (40-50),按 F5 运行并且必须等待它们被绘制。再次,滞后,不是一个很好的体验。
那么,有 WPF 可以解决这个问题,但我/我们还没有准备好迁移到 WPF。因此,我正在四处寻找解决方法或修复程序,并且在阅读其他一些库时偶然发现了 Direct2D。
让我有点困惑,因此这些问题:
1) 首先,我想要的是一种相当简洁的方法,可以用更快的硬件加速方法替换 GDI+。 是否可以在不使用 WPF 且无需重写我所有的 Windows 窗体代码的情况下做到这一点?
每当我在 Direct2D 上阅读任何内容时,我都会看到一长串通常很糟糕的 C++ 代码,告诉我如何手动编写代码以进行绘图。我不想那样。
2) 在网上阅读时,我偶然发现了 SlimDX,但我不知道如何使用它(我承认,在写作时我还没有尝试过很多)。假设我已经有一个 GUI 应用程序(Windows 窗体,标准 C# 代码)——我可以以某种方式使用 SlimDX(或类似的东西)来“替换”GDI+ 而无需过多重写吗?
我的问题是我找不到任何示例或类似的东西告诉我是否可以在我已经创建的 Windows 窗体软件中使用 SlimDX、Direct2D 或其他类似的东西,如果可以的话 - 怎么做。
希望我不要太模糊 =)
==EDIT== 2010-09-22
我已经在我的真实应用中进行了一些测试,并将其中一件缓慢的事情隔离出来:
当我将文本添加到用户控件中的某些标签时,控件会自行调整大小以适应文本。例如,包含 GroupControl 会稍微适应刚刚添加到 Labels 的 .Text-property 的文本的大小。
大约有 10 个标签控件。第一次更新标签并因此更改大小时,整个过程大约需要 500 毫秒。第二次更新标签,no大小发生变化,大约需要0毫秒。
==编辑 2== 2010-09-22
发现其中一个减速。然后向 Text-property 添加一个字符串,如果添加的文本在字符串 length 中与更新前的文本不同,则会很慢。
我正在使用 DevExpress 库,并且可以将 LabelControls 设置为 AutoSizeMode。如果我将其设置为“无”,那么当添加长度与前一个文本不同的文本时,延迟就会消失。我猜这个问题对于普通的标签控件来说是一样的,因为它也有一个 AutoSize = true/false 设置。
但是,它是一种“解决方法”,但仍然证明了我的观点 - 调整大小时它真的很慢,这很蹩脚。
【问题讨论】:
-
Ted,你能发布一些简单的 Winforms 示例项目来展示你的性能问题吗?
-
看不到如何在这里发布文件。但我尝试的是创建 1 个表单,在该表单上我放置 1 个 TabControl 和 3 页。我将使用标签、文本框和组合框的每一页(每个 tabPage 200 个控件)。然后我只是运行它,单击/在页面之间切换,你可以看到它是如何滞后的。在普通应用程序中也是如此,通常情况更糟 =(
-
我正在使用 DevExpress 库 - 那么第一个尝试的测试是使用标准的内置 Windows 控件,看看它们是否更快。恕我直言,您使用第三方控件库的事实应该在您的第一段中! [我现在添加了适当的 devexpress 标签,希望能更明显。]
标签: c# gdi direct2d slimdx devexpress-windows-ui