【问题标题】:WPF vs XNA to render thousands of spritesWPF vs XNA 渲染数以千计的精灵
【发布时间】:2010-05-03 14:34:36
【问题描述】:

我需要渲染数千个用线条相互连接的椭圆。 在 WPF 应用程序中呈现它的最佳方式(就性能而言)是什么。 WPF Canvas 绘画比 XNA 绘画差很多吗?

实际上,隐藏的问题是:是否可以在 WPF 主机内进行一些 xna 渲染?我看到了一些使用无边框 xna 窗口覆盖的示例,但没有原生解决方案......

谢谢, 奥雷利安

【问题讨论】:

    标签: c# wpf xna


    【解决方案1】:

    如果操作正确,您可以在 WPF 渲染中获得相当高的性能,其优点是您不必承受 WPF-XNA 互操作的痛苦。如果您使用 WPF 的低级渲染 API,例如 CompositionTarget.RenderingDrawingContext,您可以渲染(和动画)大量视觉效果。您还可以利用 .net 4.0 中的新 Cached Composition feature。以这个为出发点还有很多。

    【讨论】:

    • 我想我会走这条路,但我需要与每个椭圆进行一些用户交互,并且它们在 ScrollViewer 中呈现。实际上,我目前正在使用一个控件来呈现一个椭圆,另一个控件来呈现一条线。这只是原型,超过一百个椭圆的性能很糟糕。谢谢。我想我会选择 DrawingVisuals...
    • DrawingVisuals 比 Shape 派生控件(Line、Ellipse)快得多,但对于动态内容,bitbonk 的 DrawingContext 建议可能更快。
    【解决方案2】:

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

    【讨论】:

    • 我想这样做,但我听说表演在winform主机中被压垮了。猜猜这只是谣言,我必须验证这个假设。
    • 是的,这个假设必须经过测试 :) 我正在运行一个 60k+ 的三角形场景,并且性能可以接受。我正在使用BasicEffect,启用了一个光源和雾,还没有尝试过纹理。但我认为无论 XNA 端发生什么,通过 WinForms 增加的开销应该是恒定的。
    • 事实上,通过 WinForms 的渲染开销正好为零(与覆盖窗口相比)。在底层,WinForms 方法和覆盖窗口都为 Direct3D 提供了一个矩形屏幕区域供您拥有和使用。从技术上讲,调整和移动窗口的速度会变慢,但实际上是无法察觉的。
    • 有一种方法可以通过直接使用 HwndHost 来获得 XNA 的 HWND,从而使用稍微少一点的管道和没有 WinForms 依赖来做同样的事情,但是如果您已经编写了 WinForms 解决方案,则没有现在放弃它的理由。
    • @Ray Burns:很好的输入。 HwndHost 虽然需要非托管代码权限,但可能值得研究。
    【解决方案3】:

    我刚刚在 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 方面做一些工作。

    【讨论】:

      【解决方案4】:

      但是请注意,XNA 应用程序不会在没有至少 1.1 着色器 GPU 的系统上运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2019-06-29
        • 1970-01-01
        相关资源
        最近更新 更多