3

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

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

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

4

3 回答 3

2

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

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

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

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

于 2009-08-31T20:35:05.880 回答
1

我会检查SlimDX,一个比 XNA 或 WPF 更薄的 DirectX 包装器

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

于 2009-08-31T20:33:55.117 回答
0

我会在这里建议一个混合选择:使用 WPF 来做它擅长的事情(Windows UI、合成等)并使用 XNA 来渲染 3D。有一些示例演示了 XNA 与 WinForms 的结合。应该可以使用相同的“技巧”将 XNA 渲染到 WPF 中的表面上。

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

于 2009-09-02T11:23:34.027 回答