WPF与XNA:渲染数千个精灵的比较

7
我需要渲染数千个相互连接的椭圆和线段。在WPF应用程序内进行渲染,哪种方法(从性能角度)最好?WPF画布绘制比XNA绘制差很多吗?
实际上,隐藏的问题是:是否可能在WPF主机中进行一些xna渲染?我看到一些例子使用了无边框的xna窗口叠加,但没有本地解决方案...
谢谢, Aurélien
4个回答

2
如果正确地完成,您可以在WPF渲染中获得相当高的性能,这样您就不必承受WPF-XNA互操作的痛苦。如果使用WPF的低级渲染API(例如CompositionTarget.RenderingDrawingContext),您可以渲染(和动画)大量可视化内容。您还可以利用.NET 4.0中的新Cached Composition功能。还有很多其他的内容,只要把这个作为起点即可。

我想我会选择这个方式,但是每个椭圆都需要用户交互,并且它们在 ScrollViewer 中渲染。实际上,我目前正在使用一个控件来渲染一个椭圆和另一个控件来渲染一条线。这只是为了原型设计,而且当超过一百个椭圆时性能非常差。谢谢。我想我会用 DrawingVisuals... - Aurelien Ribon
1
DrawingVisuals比Shape派生的控件(Line,Ellipse)快得多,但对于动态内容,bitbonk的DrawingContext建议仍然可以更快。 - Ray Burns

2

我成功地将XNA与WPF“集成”起来,首先将XNA场景渲染到WinForms控件中,然后使用WindowsFormsHost元素在WPF中托管该控件。


我本想这样做,但听说在winform主机中性能会受到压制。我猜那只是谣言,我得测试一下这个假设。 - Aurelien Ribon
是的,这个假设必须进行测试 :) 我正在运行一个包含60k+三角形的场景,性能表现可以接受。我正在使用带有一个光源和启用雾效果的BasicEffect,还没有尝试过纹理。但我假设将其通过WinForms添加的额外开销应该是恒定的,无论XNA端发生了什么。 - Peter Lillevold
事实上,通过WinForms进行渲染的开销与使用覆盖窗口相比完全为零。在幕后,无论是WinForms方法还是覆盖窗口都会给Direct3D提供一个矩形屏幕区域来拥有和操作。调整和移动窗口在技术上会更慢,但在实践中几乎无法察觉。 - Ray Burns
可以通过直接使用 HwndHost 来获取 XNA 的 HWND 来做同样的事情,而无需 WinForms 依赖和较少的管道,但如果您已经编码了 WinForms 解决方案,现在没有理由放弃它。 - Ray Burns
@Ray Burns:好的建议。HwndHost需要非托管代码权限,但值得研究。 - Peter Lillevold

1

我在CodeProject上刚刚找到了这篇文章

我们想要以与集成画布或任何小部件相同的方式将XNA场景集成到WPF用户界面中。但是,在XNA中查看3D场景的最佳方式是将其合并到窗口中。无法像WinForm一样获取任何WPF控件的句柄。然后,技巧就在于重新编写围绕Game类的XNA框架的一部分。目标是从Panel(在我们的情况下为Canvas)继承一个新的Game类,以便将其包含在WPF可视树中。面板的视觉边界将是XNA场景的查看区域。但是,我们刚才说过,无法获得不继承自Window的视觉控件的句柄。那么我们该如何使用XNA显示3D呢?我们将简单地在面板上方显示一个没有边框的窗口。当应用程序具有焦点且面板可见时,此窗口将始终处于顶部,并在此情况下隐藏。同样,在面板不可见时,我们将停止游戏的活动。

这个帖子在微软论坛上讨论了这个问题,其中一位发帖者说:

那么,结论是你可以将XNA渲染到WPF表单中而不会出现任何问题,但你必须避免使用Game和GraphicsDeviceManager类,因为后者需要一个Game实例来运行(构造函数被定义为new GraphicsDeviceManager(Game game)),而Game类没有提供任何定义它所渲染窗口的方法。

所以看起来是可能的,但需要在XNA方面进行一些工作。


1

需要注意的是,XNA应用不能在没有至少1.1着色器GPU的系统上运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接