gpt4 book ai didi

用于自定义声波控制的 WPF Performance 渲染

转载 作者:行者123 更新时间:2023-12-02 00:01:46 25 4
gpt4 key购买 nike

我目前正在考虑为 WPF 编写一个声波可视化控件。事实上,它可以呈现任何类型的线图数据;它不一定是声波。只要数据是一组离散的样本,它就会呈现它。

我让它工作;但是性能并不理想。我做了很多代码优化,使 OnRender 方法可以快速运行。我已经用性能分析器对其进行了测试,它显示它的运行时间约为 110 毫秒,应该没问题。

但是,我发现应用程序经常停顿,而探查器没有显示原因。

在我的测试中,我注意到它可能与填充率有关。我的意思是绘制的像素数。我的测试数据包含一个正弦波,频率为 41000hz,持续时间超过 20 秒。这会产生 812000 个样本。现在我的控件根据用户查看波浪的缩放比例优化此数据。将使用大约 6000 条线条绘制整个波浪。

如果我放大波浪很长一段距离,所以我只渲染两个完整的正弦波,我仍然会绘制大约 6000 条线。 CPU 时间大致相同,为 110 毫秒,但应用程序运行平稳且不会停止,起初这似乎很奇怪。

然而,当观察它时,全波绘制几乎触及每个像素。图表绘制了一条绿线,当缩小时它会覆盖图形控件的整个背景。当仅少量放大时,背景会 overdraw 。

我是一名游戏程序员,所以我知道这个问题可能是由填充率限制引起的。如果线条绘制接触到每个像素,那么无论线条绘制的数量如何,绘制都会变慢。但是我不希望出现这种情况,因为图表在屏幕上并没有那么大。如果我更改窗口的大小,那么它确实会变慢,这再次通过猜测填充率问题得到加强。现代图形卡应该能够处理此问题,因此控件可能正在使用软件渲染。我不确定如何证明这一点!!

因此,就逻辑而言,我的 OnRender 方法非常优化。在上述两种情况下,在 CPU 上绘制所需的时间变化不大。然而,在某些情况下,如果触摸了大量像素,则会出现大约一秒的可怕滞后。

有人知道我该如何改进吗?

我考虑过的一种方法是在另一个线程上渲染屏幕外纹理,一旦完成,然后在更新纹理后调用 InvalidateVisual。我还可以经常执行无效化,这样图形渲染就会随着时间的推移而更新,而不是突然出现。

任何人都有这种事情的经验,我如何实际分析 WPF 的内部结构?

有谁知道分析器会告诉我到底是什么导致了这个问题,但正如我所说,我认为这可能归结为实际的硬件渲染和填充率问题。

请注意,我的图形控件继承自 Canvas,线条绘制是使用 StreamGeometryContext 完成的。我还卡住了几何体和所有的画笔和笔。

谢谢

最佳答案

我编写的软件需要非常快速地绘制大量频谱数据。 WPF 的保留图形系统不适合绘制(图形化)大量频繁变化的数据。我们使用 D3D9 来绘制图形。 WPF 提供了一种通过 D3DImage 类将其放入其渲染系统的方法,在该类中它可以成为 ImageBrush。因此,它以牺牲一点性能为代价避免了与空域限制相关的问题,但仍然比使用 WPF 对象渲染快得多。

我还看到了两个非常好的图形库,它们各有优缺点。

  1. SciChart实际上是一个基于软件的 WPF 渲染图表工具,但具有良好的性能。
  2. Lightning Chart使用 DirectX(通过 SlimDX 库,它是一个托管的 .NET 包装器)并且非常注重性能。

关于您关于软件渲染的问题... WPF Performance Suite具有分析工具和叠加层,可以显示您的应用程序的哪些部分正在被软件渲染。您可能想从 Microsoft 下载它并尝试一下。

据我所知,WPF 的呈现系统几乎不是最佳的 (A Critical Deep Dive into the WPF Rendering System)。对于 WPF 的设计目的,它很棒,但也有其局限性。

我的建议是,如果您有游戏开发和 DirectX 方面的经验,并且需要一种方法来快速绘制大量数据的图形,则可以通过 WPF 中的 D3DImage 类查看与 D3D 的互操作。

关于用于自定义声波控制的 WPF Performance 渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20953030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com