我知道WPF更复杂,更灵活,可以考虑做更多的计算。但是由于渲染是在GPU上完成的,对于相同的应用程序(功能和视觉上),它不会比Winforms更快吗?
我的意思是当你没有运行任何游戏或重型3D渲染时,GPU并没有做繁重的工作,对吧?而CPU总是很忙。
这是一个有效的假设,还是WPF的GPU利用率在其管道中是一个非常小的操作?
编辑:我感兴趣的应用程序是一个3D建模和动画软件,您可以在其中使用3d视口来导航和编辑场景以及场景中的对象。但我想使用WPF因为它的现代架构,而且它是从头开始的。EDIT2:同样出于我的目的,由于软件的高端要求,我会将DirectX用于应用程序本身。对于使用低端的人或没有专用GPU的计算机,这没关系,因为他们不在我的主要客户区域。就像其他用于电影和游戏的高端3D软件一样,要求功能强大的计算机从应用程序中充分受益是可以理解的。
答案 0 :(得分:18)
如果机器具有GPU,您将在WPF中获得更好的渲染性能。
我们在WinForms中编写了一个大型桌面应用程序,现在正在移植到WPF。我们目睹了更好的渲染性能,特别是在调整窗口大小或重绘控件时。
我们还发现WPF“控件”比WinForm控件更轻量级。如果我没记错,WPF控件不一定需要操作系统句柄,也不要通过WndProc注册Windows窗口消息,至少不是独立的。
对于您的情况,由于您正在构建一个3d建模应用程序,假设机器上有一些3d硬件,您应该绝对使用WPF而不是WinForms。
答案 1 :(得分:7)
对于您描述的应用场景,我希望WPF能够在全功能GPU上大幅超越WinForms进行3D工作。
应用程序类型之间的差异不仅仅是渲染3D矢量管道。 WPF的内部架构与WinForms完全不同,WinForms专门用于克服多年以前使用Windows GDI和WinForms应用程序所获得的警告。
(WinForms是一个相对较薄的Windows GDI和用户模型包装器,最初是在20世纪80年代后期创建的.Windows用户控件模型在过去25年中不断发展,但核心架构模式基本没有变化。)
例如,WPF始终将UI呈现与应用程序逻辑分开。当WPF窗口进行绘制时,实际渲染发生在后台线程上。在视频回扫间隔期间,刷新的视觉效果会翻转到显示屏,因此您不会在屏幕上获得部分blits或“撕裂”伪影。
WinForms没有这个。如果在WinForms应用程序中渲染到DirectX或OpenGL曲面,则必须完成翻转视频页面并确保在合适的时间发生以避免屏幕撕裂伪像的工作。
Wpf的默认控件具有GPU感知功能,可以通过发光和透明度自定义样式,并且所有GPU都加速了。 WinForms控件并没有从GPU功能中获益,因为WinForms(Windows用户控件)用于渲染的唯一内容是2D bitblit和矩形填充。使用WinForms可以实现发光,透明度和动画,但是您必须执行所有工作才能实现它们。
在WPF中,UI的光滑主要是设计和样式化,让WPF为您完成。在WinForms中,你必须自己推动像素。
答案 2 :(得分:6)
这是一个非常难以回答的问题。
WPF性能的很大一部分是你的GPU。一个好的GPU可以让WPF表现出色。 WPF可以非常高效。如果您的要求是拥有一个不错的GPU,因为它是一个3D建模程序,您可能会发现WPF性能与Windows窗体一样好或更好 - 尽管这实际上取决于您使用的是什么。
话虽如此,通常很难比较 - 主要是因为WPF允许您添加许多人们在Windows窗体中甚至从未尝试过的视觉效果。许多WPF应用程序“看起来”更快,即使它们在某些情况下由于额外的视觉线索而实际上更慢。
话虽这么说,如果你有很多控件,WPF实际上可以大大超过Windows Forms。在Windows窗体中,每个控件都需要一个单独的窗口句柄,并接收自己的消息集。通过大量控制,这实际上可以大大降低速度。
这里真正的问题应该是WPF perf。对你的应用来说“足够好”。如果您正在进行3D建模应用程序,WPF可能不会成为您的瓶颈 - 应该没问题。
答案 3 :(得分:2)
对于3D建模,WPF显然是比WinForms更好的选择 - 但它距离理想还有很长的路要走。 Winforms根本没有(直接)支持3D渲染,WPF也有一些。但是,对于主要针对3D渲染的程序,您可能会更专注于专门用于3D渲染任务的内容,例如OpenGL或Direct3D。
就他们自己来说,这两者都没有提供超过WPF的巨大优势,但除非你所做的是相当专业的,否则我不会直接使用它们。我使用OpenSceneGraph或Ogre3D之类的东西,可以使用其中任何一种进行渲染,但提供更高级别的界面,并且可以更好地管理渲染场景。
这些中的任何一个或两个可能都可以使用WPF进行实际绘图 - 但我非常确定这两者都没有,至少目前是这样。我不知道他们是否曾经 - 他们可能,但我怀疑这是一个真正的优先事项,因为他们已经支持OpenGL和Direct3D。为了他们的目的,WPF没什么优势。
答案 4 :(得分:1)
看到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"/>