1

在我们的 WPF 应用程序中,我们需要为一个音频应用程序显示大约 64 个实时电平表。我们在 WPF 上进行的测试,即使在渲染基本图元时尽可能高效,我们仍然可以证明它离我们的应用程序需要的位置很远,经常使主线程陷入困境,以至于它没有响应输入。

因此,我们必须使用针对图形性能进行更优化的东西,例如 DirectX(通过 SlimDX 或 SharpDX)或 OpenGL/ES(通过将其转换为 DirectX 调用的 Atlas。)

我的问题是,是否可以创建多个基于 DirectX 的小型区域,每个区域代表一个单独的仪表,或者就此而言,这是否是正确的方法?我的理解是,您必须至少运行整个窗口,而不是其中的一部分。

我在后者中看到的问题是空域问题,其中您不能在同一窗口中的 DirectX 内容前面有 WPF 内容,我们真的不希望重做 DirectX 中的所有控件,因为对于其他非-meter 95% 的 UI WPF 都很棒!

我已经读到您可以将 DirectX 渲染到画笔,然后在 WPF 中使用它,或者使用 WriteableBitmap 类,它可以让您直接访问 WPF 然后在其渲染线程中使用的缓冲区,这两者似乎都不会受到空域问题,但这似乎我们会回到 WPF 成为瓶颈的同一个地方,因为它仍然需要进行渲染。

我们当然会花几周的时间来测试以上所有内容的示例应用程序,但我想知道我是否朝着正确的方向前进,和/或是否有任何警告我们可以通过与人交谈来避免有经验做这样的事情以避免常见的陷阱等。因此,任何评论将不胜感激。

我希望我们甚至可以在某个地方创建一个 wiki 来讨论这个话题,因为它似乎很受欢迎,尽管它遍布各地,使得新进入者很难获得他们所寻求的信息。

4

2 回答 2

1

使用 wpf / d3d 互操作,您应该始终尝试创建最少数量的互操作调用。因此,您应该更喜欢在单个渲染目标中渲染所有 64 个电平表(它还允许您批量原始渲染并以最少数量的 gpu 调用绘制所有内容)。

您应该尝试使用允许您与 wpf 渲染器共享您自己的 D3D 纹理的 D3DImage API。

于 2013-09-26T20:25:19.507 回答
0

如果 WPF 不能真正处理这 64 个移动条,您可以使用单个 D3DImage 并使用 Direct3D9 将所有条直接渲染到它。对于您的特定场景,您不应该有任何性能问题。

于 2013-09-27T02:08:29.407 回答