头部跟踪应用的WPF 3-D性能

时间:2009-08-31 20:22:12

标签: wpf performance graphics xna photogrammetry

我正在创建一个带有一些增强现实功能的全屏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中做错了什么,这会减慢速度?

3 个答案:

答案 0 :(得分:2)

我在WPF中没有做足够的3D以便能够说出可能导致缓慢的原因,但我确实注意到它的模型数据结构效率不高。虽然这可能不是原因,但可能是整个管道普遍缓慢的症状。

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

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

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

答案 1 :(得分:1)

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

在每一帧上更改投影的问题在于,像XNA / WPF这样的API并没有考虑到这一点,所以优化了在初始化阶段将投影设置一次,然后不再设置。

答案 2 :(得分:0)

我建议在这里选择一个混合选择:使用WPF擅长(Windows UI,合成等)并使用XNA渲染3D。有samples out there演示了如何将XNA与WinForms结合使用。应该可以使用相同的“技巧”将XNA渲染到WPF中的表面上。

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