C#WPF OnPaint方法替代?

Cor*_*urn 7 c# wpf

在C#WinForms中,无论何时在这里或那里制作一个小游戏,我都会编写一个快速类,它是System.Windows.Forms.Panel的子类,在构造函数中,将DoubleBuffered设置为true.然后你可以覆盖OnPaint方法来显示游戏元素.我已经做了2到3年了,但我真的想拥抱WPF和XAML,我非常喜欢它用于常规应用程序布局.在WPF中这样做有什么相同之处?

Bru*_*ant 4

不是您寻求的答案,而是:您不应该将 WPF 用于游戏。坚持使用 Forms(它不会被 MS 抛弃,因为 WPF 不会取代 Forms),或者如果您想进入下一个级别,请尝试 XNA。


更新:我昨天很快回答了这个问题,因为我很着急,而且我也研究了WPF来做游戏,所以我不想在没有正确答案的情况下离开OP。

这是交易:

WPF 的目标是简化丰富的 UI 开发。首先,MS 理解表单将行为表示混合在一起的编码方式。这对于应用程序设计和可维护性来说都是不好的。此外,在 Forms 中,一切都必须编码;图书馆本身为用户做的事情很少。例如,如果您想要一个具有不同外观的按钮,则必须重写其Draw方法,然后以某种方式绘制代表它的任何图形。

使用 WPF,行为与表示分离。例如,什么是按钮?在 Windows 中,我们知道它是一个带有圆角的盒子,但环顾四周...您的鼠标滚动也是一个按钮,尽管它看起来与 Windows 默认按钮完全不同。作为一个按钮意味着具有特定的行为(主要是点击),而不是看起来像一个盒子。对于 WPF,这非常简单。您定义一个按钮,然后使用图像或文本将其呈现给用户。

当然,这一切都是有代价的;例如,WPF 比 Forms 慢。游戏需要快,尽量不要浪费资源。在游戏中,每个行为都倾向于编码(当然不是 UI),每个演示都是自定义的(2D 图形或 3D 对象),因此无论如何您都必须进行大量编码。因此,您正在使用一项昂贵的技术,但却放弃了它的大部分好处。

但我不是专家。您可以查看博客,其中一位前 Microsoft 员工尝试使用 WPF 进行游戏近两年。他的结论是:

您可能已经注意到该博客已经有一段时间没有更新了。WPF 的性能似乎无法满足严肃游戏的要求,我已经认输了,并将继续使用 XNA 来开发游戏。我只是认为不值得与 WPF 框架对抗......

从那里我得出了大部分结论。

  • -1。“WPF 比 Forms 慢” - 你不知道自己在说什么。“坚持形式”是有史以来最不明智的建议。您还可以告诉 OP“坚持”COBOL 或 100 年前的任何其他恐龙技术。 (10认同)
  • 我不想将一项技术强加到项目中。如果 WPF 不是一个合适的选择,我可以接受。 (2认同)
  • 另一位博主显然是将 WPF 与 XNA/DirectX 进行比较,而不是与 Forms 进行比较。WPF 和 Forms 都不适合“严肃”的游戏,但我不认为 Forms 比 WPF 慢。Forms 不提供*任何*硬件加速,并且,如果您想要进行任何类型的特殊渲染,无论如何您都将在 CPU 上绘制自己的像素。除非您要同时处理数千个屏幕上的对象(如果您使用画笔,则不必这样做),否则 WPF 通常更快。此外,WPF 还为几乎所有内容提供着色器和基础硬件加速——平铺、调整大小等等。 (2认同)
  • @BrunoBrant更不用说你的答案并没有真正回答OP关于如何在WPF中“绘制”的问题,这是通过简单地将一些XAML放在一起来实现的(而不是你在winforms中需要的可怕的程序代码黑客)。 (2认同)