【问题标题】:WPF 3-D performance for head-tracking app头部跟踪应用程序的 WPF 3-D 性能
【发布时间】:2009-08-31 20:22:12
【问题描述】:

我正在努力创建一个具有一些增强现实功能的全屏 3-D 应用程序(基于 Johnny Lee's Wii head tracking app),而且似乎 WPF 太慢了,即使是我正在使用的简单模型也无法渲染合理的帧率。我认为问题在于我需要在几乎每一帧上更改相机的视图和投影,因为应用程序的性质(它使用网络摄像头来跟踪你的脸,并使用该数据来移动相机改变它的视角)。

我花了很多时间试图缩小问题的范围,这肯定与图形有关,而不是我使用的头部跟踪 API 的速度。此外,我在 XNA 中重新创建了该应用程序,它似乎在那里工作正常(28 FPS 与 WPF 中的 9)。最后,当我移除“墙”或将窗口缩小很多(比如 800 x 600)时,WPF 的性能大大提高,这让我认为瓶颈是图形计算。

因此,我需要找到一个新的图形后端来使用,或者找到一种方法让这个应用程序的 WPF 更快。我主要关注 DirectX 和 XNA,可能还有 OpenGL。关于哪些 API 最适合在 .NET 中用于此应用程序的任何建议?或者,知道我在 WPF 中做错了什么会减慢速度吗?

【问题讨论】:

    标签: wpf performance graphics xna photogrammetry


    【解决方案1】:

    我对 WPF 中的 3D 做得还不够,无法说出导致速度缓慢的原因,但我确实注意到它的模型数据结构效率不高。虽然这可能不是原因,但它可能是整个管道普遍缓慢的症状。

    让我想到的一件事是 WPF 是在软件中渲染场景,而不是使用显卡上的硬件加速。事实上,您可以通过更小的窗口获得更好的性能(尽管您没有说好多少)。

    如果您从模型中移除任何纹理,您是否也会获得更好的性能?

    我认为你选择 Direct3D 还是 OpenGL 并不重要——几乎所有现代显卡都同样支持它们。如果您坚持使用 .NET,XNA 是显而易见的选择,因为它已集成到 Visual Studio(甚至是 Express 版本)中。

    【讨论】:

    • 本身没有“纹理”。我只是在我的所有模型上使用 SolidColorBrush。 XNA 可能是我目前的首选,假设 WPF 不会削减它。到目前为止,我自己的问题是 XNA 中的图形工作方式对我来说似乎很奇怪,但也许这只是我需要克服的学习曲线。
    • @Jonathan - 纹理的想法只是一个建议 - 它曾经是可以触发软件渲染的事情之一。
    【解决方案2】:

    我会查看SlimDX,它是比 XNA 或 WPF 更薄的 DirectX 包装器

    在每一帧上更改投影的问题在于,像 XNA/WPF 这样的 API 在设计时并未考虑到这一点,因此进行了优化,以便在初始化阶段设置一次投影,然后不再设置。

    【讨论】:

    • 为什么?我可以毫无问题地在 XNA 中的每一帧上设置我的视图/投影矩阵。它们只是输入到在硬件中进行计算的着色器。自己计算矩阵并更新这些着色器不是瓶颈。
    【解决方案3】:

    我会在这里建议一个混合选择:使用 WPF 来发挥它的优势(Windows UI、合成等)并使用 XNA 来渲染 3D。 samples out there 演示了 XNA 与 WinForms 的结合。应该可以使用相同的“技巧”将 XNA 渲染到 WPF 中的表面上。

    更新:直接将 XNA 与 WPF 一起使用可能存在问题。 This thread 表示将 XNA 与 WinForms 一起使用,然后在 WPF 中托管 WinForms 控件是解决这些问题的一种方法。我自己还没有测试过这个(还)。

    【讨论】:

    • 目前在 WPF 中嵌入 XNA 存在一些问题,据我了解,这与设备属性冲突有关。 XNA 和 WPF 的人都知道这个问题,但我认为它还没有解决。使用像 SlimDX 这样的东西应该不会有同样的问题。
    • 查看我的更新。这可能是一种解决方法,但是,使用 SlimDX 现在可能是最简单的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多