演示:基于WPF的DrawingVisual开发的频谱图和律动图

一、目的:基于WPF的DrawingVisual开发的频谱图和律动图

二、效果演示

波形图

极坐标

律动图极坐标图

律动图柱状图

Dock布局组合效果

三、环境

VS2022,Net7,Win10,NVIDIA RTX A2000

四、主要功能

支持设置起始频率,终止频率,中心频率,频率宽度,最小功率和最大功率设置

通过以上参数设置可以控制限制坐标轴的范围

支持显示Fps(刷新率)

本示例可以看到FPS在40-50左右

支持播放.MP3.WAV等音频文件

支持缩放平移等操作

支持ToolTip鼠标悬停显示频谱信息

支持暂停/播放操作

五、性能

渲染数据量情况(4000左右

本示例中使用0-20000Hz 范围数据,采样使用FftSize.Fft8192 ,实际渲染点4094

刷新率情况

关于刷新率对数据量,数据种类,硬件环境等都有关系

本示例显卡型号使用的:NVIDIA RTX A2000,示例中对于普通歌曲音频来说可以渲染到50-60帧/秒,本机显示器设置的刷新率是60Hz(一般显示器基本都是60Hz)

CPU和GPU使用情况

可以看到CPU占用10-20%左右 ,**GPU占用10-15%**左右

总结:综上总结,在当前环境下,渲染音频数据4000左右个点,刷新率可以达到55+左右

对于以上结果,不同机器环境,数据样式,显示方式等都会有影响,比如:

1、同样的数据,显示全屏和小窗口性能不一样,全屏FPS会有所下降而且很明显;

2、对于幅度波动比较大且不规则的数据,比如随机生成的数据,FPS会有所下降(目前还没有验证)

3、数据点数越多FPS会下降,相反越少可以提高FPS

六、参考

主要绘制方式

使用DrawingContext绘制,将数据生成Geometry通过DrawGeometry绘制

个人总结绘制高性能图谱时的参考意见

1、使用轻量的绘图方式,比如:DrawingVisual(可以应用硬件加速渲染);

2、尽量减少数据量,越少的数据绘制性能越高;

3、将绘制线程和更新数据线程分开,绘制线程中不要写太多逻辑尽量简单;

4、显示的范围尽量不要太大,越小的屏幕范围性能越高;

5、条件允许尽量提高硬件环境,最主要提高GPU环境;

6、Visual Studio环境和Debug环境都会影响绘制性能,可以打包或生成Release测试最终性能;

以上是个人总结的参考意见,实际开发中还是需要根据具体情况去做优化,在调试中不断去挖掘哪些操作可能影响到渲染性能

七、演示视频

【WPF-Spectrogram】频谱分析仪_哔哩哔哩_bilibili

需要了解的知识点

DrawingContext Class (System.Windows.Media) | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

控件库 - WPF .NET Framework | Microsoft Learn

WPF 介绍 | Microsoft Learn

XAML概述 - WPF .NET | Microsoft Learn

Windows Presentation Foundation 简介 - WPF .NET | Microsoft Learn

使用 Visual Studio 创建新应用教程 - WPF .NET | Microsoft Learn

了解更多

适用于 .NET 8 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

适用于 .NET 7 的 WPF 的新增功能 - WPF .NET | Microsoft Learn

System.Windows.Controls 命名空间 | Microsoft Learn

Reference Source

Sysinternals - Sysinternals | Microsoft Learn

Windows app development documentation - Windows apps | Microsoft Learn

欢迎使用 Expression Blend | Microsoft Learn

https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/?view=netdesktop-7.0&WT.mc_id=MVP_380318

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

相关推荐
踏上青云路3 小时前
xceed PropertyGrid 如何做成Visual Studio 的属性窗口样子
ide·wpf·visual studio
code_shenbing4 小时前
基于 WPF 平台使用纯 C# 实现动态处理 json 字符串
c#·json·wpf
苏克贝塔9 小时前
WPF5-x名称空间
wpf
xcLeigh12 小时前
WPF实战案例 | C# WPF实现大学选课系统
开发语言·c#·wpf
one99612 小时前
.net 项目引用与 .NET Framework 项目引用之间的区别和相同
c#·.net·wpf
xcLeigh12 小时前
WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel
c#·wpf
军训猫猫头1 天前
52.this.DataContext = new UserViewModel(); C#例子 WPF例子
开发语言·c#·wpf
Maybe_ch1 天前
WPF-系统资源
wpf
苏克贝塔1 天前
WPF3-在xaml中引用其他程序集的名称空间
wpf
军训猫猫头1 天前
54.DataGrid数据框图 C#例子 WPF例子
ui·c#·wpf