哪个具有更快的运行时性能:WPF 或 Winforms?

Posted

技术标签:

【中文标题】哪个具有更快的运行时性能:WPF 或 Winforms?【英文标题】:Which one has a faster runtime performance: WPF or Winforms? 【发布时间】:2011-02-01 07:27:23 【问题描述】:

我知道 WPF 更复杂且更灵活,因此可以考虑进行更多计算。但既然渲染是在 GPU 上完成的,那么对于同一个应用程序(功能和视觉)来说,它不会比 Winforms 更快吗?

我的意思是,当您不运行任何游戏或繁重的 3D 渲染时,GPU 不会做繁重的工作,对吧?而 CPU 总是很忙。

这是一个有效的假设,还是 WPF 的 GPU 利用率是其管道中非常小的操作?

编辑:我感兴趣的应用程序是 3d 建模和动画软件,您可以在其中导航和编辑场景的 3d 视口以及场景内的对象。但我想使用 WPF 因为它的现代架构,而且它是从头开始的。

EDIT2:出于我的目的,由于该软件的高端要求,我将直接使用 DirectX 来处理应用程序本身。至于使用低端或没有专用 GPU 的计算机的人,没关系,因为他们不在我的主要客户区域。就像其他用于电影和游戏的高端 3D 软件一样,需要一台功能强大的计算机才能充分受益于该应用程序是可以理解的。

【问题讨论】:

这取决于应用程序。 对不起,应该添加更多细节。 我不是专家,但我相信确切的硬件(和相应的驱动程序)也可能对性能产生重大影响。 您也不应该认为并非所有计算机都有 GPU,有些计算机只是具有在 CPU/芯片组上运行的模拟... 【参考方案1】:

如果机器有 GPU,你会在 WPF 中获得更好的渲染性能。

我们有一个用 WinForms 编写的大型桌面应用程序,现在正在移植到 WPF。我们见证了更好的渲染性能,尤其是在调整窗口大小或重绘控件时。

我们还发现 WPF“控件”比 WinForm 控件更轻量级。如果我没记错的话,WPF 控件不一定需要操作系统句柄,并且不通过 WndProc 注册 Windows 窗口消息,至少不是独立的。

对于您的情况,由于您正在构建一个 3d 建模应用程序,并且假设机器上有一些 3d 硬件,因此您绝对应该使用 WPF 而不是 WinForms。

【讨论】:

谢谢,而且由于 WPF 也使用 GPU,应用程序和 WPT 本身在使用该资源时会发生争执吗? 如果您在 3d 应用程序之上创建自己的 2d 菜单系统,则不会更多。事实上,WPF 可能会更有效地做到这一点。 :)【参考方案2】:

对于您描述的应用场景,我预计 WPF 在功能齐全的 GPU 上的 3D 工作性能会大大优于 WinForms。

应用程序类型之间的区别不仅仅是渲染 3D 矢量管道。 WPF 的内部架构与 WinForms 完全不同,专门设计用于克服从多年以前使用 Windows GDI 和 WinForms 应用程序的经验中学到的警告。

(WinForms 是最初在 1980 年代后期创建的 Windows GDI 和用户模型的一个相对薄的包装器。Windows 用户控件模型在过去 25 年中不断发展,但核心架构模式基本没有改变。)

例如,WPF 总是将 UI 呈现与应用程序逻辑分开。当 WPF 窗口开始绘制某些东西时,实际呈现发生在后台线程上。刷新的视觉效果会在视频回溯间隔期间翻转到显示器,因此您不会在屏幕上看到部分光点或“撕裂”伪影。

WinForms 不做这些。如果您在 WinForms 应用程序中渲染到 DirectX 或 OpenGL 表面,您必须完成翻转视频页面的工作,并确保它发生在正确的时间以避免屏幕撕裂伪影。

Wpf 的默认控件是 GPU 感知的,并且可以自定义样式,包括发光和透明度以及其他所有 GPU 加速的东西。 WinForms 控件不会从 GPU 功能中显着受益,因为 WinForms(Windows 用户控件)用于渲染的唯一东西是 2D bitblit 和矩形填充。 WinForms 可以实现发光、透明度、动画,但您必须完成所有工作来实现它们。

在 WPF 中,UI 的流畅度主要是设计和样式的问题,以便 WPF 为您完成。在 WinForms 中,您必须自己推送像素。

【讨论】:

在 Windows XP 上的 WPF 中,至少是一件很小但令人讨厌的事情。这在 Vista 及更高版本中得到了解决,因此它会咬人使用 Windows 的嵌入式版本(除了 XP 之外没有 RTM)。在制作高对比度动画时,该工件会失去垂直同步,即使是播放高对比度的 MPEG 文件。 如果您必须支持 WinXP 或更早版本,无论如何我都不建议您使用 WPF。仅仅因为框架可以在技术上在那里执行并不意味着它会很好地工作。 ;> 那时,没有 Windows Vista Embedded,只有 Windows XP Embedded :) Windows 7 Embedded 几年后问世...【参考方案3】:

这是一个很难回答的问题。

WPF 性能的很大一部分是您的 GPU。一个好的 GPU 可以为 WPF 提供良好的性能创造奇迹。 WPF 可以非常高效。如果您的要求是有一个像样的 GPU,因为它是一个 3D 建模程序,您可能会发现 WPF 性能与 Windows 窗体一样好或更好 - 尽管这实际上取决于您使用的是什么。

话虽如此,通常很难进行比较 - 主要是因为 WPF 允许您添加许多人们甚至在 Windows 窗体中都不会尝试的视觉效果。许多 WPF 应用程序“看起来”更快,尽管由于额外的视觉线索,它们在某些情况下实际上速度较慢。

话虽如此,如果您有很多控件,WPF 实际上可以在相当多的程度上胜过 Windows 窗体。在 Windows 窗体中,每个控件都需要一个单独的窗口句柄,并接收自己的消息集。有了很多控件,这实际上可以大大减慢速度。

这里真正的问题应该是 WPF 性能。对于您的应用程序来说“足够好”。如果您正在开发 3D 建模应用程序,那么 WPF 可能不会成为您的瓶颈——应该没问题。

【讨论】:

谢谢,在 Winforms 中需要单独的窗口句柄的开销是多少?此外,由于 WPF 也使用 GPU,因此应用程序和 WPT 本身在使用该资源时是否会发生争执? @Joan:每个窗口句柄必须通过消息泵接收单独的消息。如果您制作一个包含数百个控件的屏幕,那么它在 Windows 窗体中的延迟确实很严重——尤其是在需要自定义呈现的情况下。至于“战斗” - 不是真的。请记住,Vista + W7 使用显卡进行所有桌面渲染——现代 GPU 非常擅长处理这个问题。我做科学。软件/3d 建模,并专门为我们的新产品使用 WPF,并且喜欢性能。 谢谢里德。好想法。您的应用程序也可以在线使用吗?想知道即使看到屏幕截图也会很酷:O @Joan:没有 WPF 应用程序。我们的一些(较旧的)代码可以在我公司的网站上在线获得——它在 3D 和数学方面做得很好,但不是现代 UI...【参考方案4】:

对于 3D 建模,WPF 显然是比 WinForms 更好的选择——但距离理想还有很长的路要走。 Winforms 根本没有(直接)支持 3D 渲染,而 WPF 有一些。但是,对于主要针对 3D 渲染的程序,您最好使用更专门用于 3D 渲染任务的程序,例如 OpenGL 或 Direct3D。

就其本身而言,它们都没有提供比 WPF 更大的优势,但除非您正在做的事情相当专业,否则我不会直接使用它们。我会使用 OpenSceneGraph 或 Ogre3D 之类的东西,它们可以使用其中任何一个进行渲染,但提供了更高级别的界面,并且可以更多地管理渲染场景。

这两种方法中的一种或两种可能都可以使用 WPF 进行实际绘图——但我很确定两者都没有,至少目前是这样。我不知道他们是否会——他们可能会,但我怀疑这是一个真正的优先事项,因为他们已经支持 OpenGL 和 Direct3D。就他们的目的而言,WPF 几乎没有什么优势。

【讨论】:

谢谢,是的,它在处理事情的方式上是一个相当专业的应用程序。现在我只想支持 Windows,所以会坚持 DirectX。我知道 WPF 具有 3d 功能,但如果我没记错的话,我认为它不会与 DirectX 本身竞争。但是所有的 UI 等我都打算使用 WPF。 虽然 OpenGL 也是可移植的,但比起 DirextX,更喜欢它的主要原因是它so 更易于使用。【参考方案5】:

鉴于 WPF 实际上在底层使用 DirectX,而且您使用 XAML 来指定 DirectX 对象,因此 WPF 是迄今为止最简单的解决方案。

Example coding a camera in xaml:

<PerspectiveCamera x:Key="Camera"
 Position="0, 0, 4"
 LookDirection="0, 0, -4"
 UpDirection="0, 1, 0"
 FieldOfView="30"/>

【讨论】:

谢谢,您的意思是我可以使用 XAML 访问整个 DirectX SDK?我打算用 SlimDX 做 3d 的东西。 一句警告:虽然我发现 WPF 3D 的东西很棒,但实际上没有很好的方法将 3D 内容渲染到位图,所以如果你需要导出你的 3D对于 3D 部分,我会选择 SlimDX。请参阅***.com/questions/2179042/… 了解更多信息。

以上是关于哪个具有更快的运行时性能:WPF 或 Winforms?的主要内容,如果未能解决你的问题,请参考以下文章

WPF 矩形与边框:哪个性能更好?

哪个更快 - 游标或 ArrayList?

子查询或 leftjoin with group by 哪个更快?

MongoDB:运行更快的查询,这更好 Pymongo 或 MongoEngine

哪个更快?组合或多个查询?

wpf没有qt那样的索引吗