当前位置: 首页 > news >正文

演示:基于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个人主页-哔哩哔哩视频

相关文章:

  • 【分布式微服务云原生】10分钟打造坚不可摧的系统:深入探索系统的鲁棒性
  • 在树莓派上基于 LNMP 搭建 Nextcloud
  • 图灵完备-奇数个信号
  • 百度智能体创建:情感领域的创新力量
  • 【大模型对话 的界面搭建-Open WebUI】
  • 【C++算法】5.双指针_乘最多水的容器
  • OIDC9-OIDC集成登录功能(SpringBoot3.0)
  • 【Linux网络】详解TCP协议(3)
  • GitLab CI/CD脚本入门
  • JAVA工具类——Collections
  • AI学习指南深度学习篇-丢弃法Python实践
  • FTP访问方式详解
  • 【JVM】JVM执行流程和内存区域划分
  • 04_OpenCV图片缩放
  • element-plus中el-table固定列fixed失效问题
  • @angular/forms 源码解析之双向绑定
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • storm drpc实例
  • Vue小说阅读器(仿追书神器)
  • Vue学习第二天
  • 搞机器学习要哪些技能
  • 如何学习JavaEE,项目又该如何做?
  • 什么是Javascript函数节流?
  • 实现简单的正则表达式引擎
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Hibernate主键生成策略及选择
  • hi-nginx-1.3.4编译安装
  • ionic入门之数据绑定显示-1
  • postgresql行列转换函数
  • 函数计算新功能-----支持C#函数
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • #Z0458. 树的中心2
  • #控制台大学课堂点名问题_课堂随机点名
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (3)llvm ir转换过程
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (待修改)PyG安装步骤
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (五)关系数据库标准语言SQL
  • (转)fock函数详解
  • (转)人的集合论——移山之道
  • .gitignore
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net 代码性能 - (1)
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .net打印*三角形
  • .net和jar包windows服务部署
  • .NET值类型变量“活”在哪?