【发布时间】:2010-05-03 14:34:36
【问题描述】:
我需要渲染数千个用线条相互连接的椭圆。 在 WPF 应用程序中呈现它的最佳方式(就性能而言)是什么。 WPF Canvas 绘画比 XNA 绘画差很多吗?
实际上,隐藏的问题是:是否可以在 WPF 主机内进行一些 xna 渲染?我看到了一些使用无边框 xna 窗口覆盖的示例,但没有原生解决方案......
谢谢, 奥雷利安
【问题讨论】:
我需要渲染数千个用线条相互连接的椭圆。 在 WPF 应用程序中呈现它的最佳方式(就性能而言)是什么。 WPF Canvas 绘画比 XNA 绘画差很多吗?
实际上,隐藏的问题是:是否可以在 WPF 主机内进行一些 xna 渲染?我看到了一些使用无边框 xna 窗口覆盖的示例,但没有原生解决方案......
谢谢, 奥雷利安
【问题讨论】:
如果操作正确,您可以在 WPF 渲染中获得相当高的性能,其优点是您不必承受 WPF-XNA 互操作的痛苦。如果您使用 WPF 的低级渲染 API,例如 CompositionTarget.Rendering 和 DrawingContext,您可以渲染(和动画)大量视觉效果。您还可以利用 .net 4.0 中的新 Cached Composition feature。以这个为出发点还有很多。
【讨论】:
我已经成功地将 XNA 与 WPF “集成”,首先将 XNA 场景渲染到 WinForms 控件,然后使用 the WindowsFormsHost element 在 WPF 中托管该控件。
【讨论】:
BasicEffect,启用了一个光源和雾,还没有尝试过纹理。但我认为无论 XNA 端发生什么,通过 WinForms 增加的开销应该是恒定的。
HwndHost 虽然需要非托管代码权限,但可能值得研究。
我刚刚在 CodeProject 上找到了this article:
我们希望以与集成画布或任何小部件相同的方式将 XNA 场景集成到 WPF 用户界面中。但在 XNA 中查看 3D 场景的最佳方式是将其合并到窗口中。不可能像使用 WinForm 那样获得任何 WPF 控件的句柄。诀窍是围绕 Game 类重写 XNA 框架的一部分。目标是从 Panel 继承一个新的 Game 类(在我们的例子中是 Canvas),以便能够将其包含在 WPF 可视化树中。面板的视觉边界将是 XNA 场景的可视区域。然而,我们刚刚说过,不可能获得不继承自 Window 的可视控件的句柄。那么我们如何用 XNA 显示 3D 呢?我们将简单地在面板上方显示一个没有边框的窗口。当应用程序具有焦点并且面板可见并且在这种情况下将被隐藏时,此窗口将始终位于顶部。同样,当面板不可见时,我们将停止游戏的活动。
Microsoft 论坛上的This thread 对此进行了讨论,一位发帖者指出:
然后,结论是您可以毫无问题地将 XNA 渲染为 WPF 表单,但您必须避免使用 Game 和 GraphicsDeviceManager 类,因为后者需要运行 Game 实例(构造函数定义为 new GraphicsDeviceManager(Game game )) 并且 Game 类没有提供任何方法来定义它呈现的窗口。
所以看起来这是可能的,但需要在等式的 XNA 方面做一些工作。
【讨论】:
但是请注意,XNA 应用程序不会在没有至少 1.1 着色器 GPU 的系统上运行。
【讨论】: