一、目的:分享一个基于WPF的DrawingVisual开发的高刷新率示波器
二、效果演示
特此说明:由于Gif录制工具帧率不够,渲染60帧用了4.6秒,平均帧率在12Hz左右,所以展示效果不好,想要看好些的效果可以看文章下面的B站视频作为参考
但B站的录制工具也是在25帧/秒这样,而电脑默认满帧60Hz,应用程序也可以渲染到50-60帧/秒,所以实际应用程序效果要好于视频效果
如下示例中,FPS部分就是展示实际渲染的帧率基本可以保持在50-60Hz之间(60Hz是本电脑设置的默认最高帧率)
随机数据(2000条数据)
正弦曲线(2000条数据)
自定义波形(2000条数据)
脉冲波形(2000条数据)
方波波形 (2000条数据)
三、环境
VS2022,Net7,Win10,NVIDIA RTX A2000
四、主要功能
支持多种波形数据源作为测试数据
支持多种渲染模式(主要分为矢量和位图)
支持设置起始频率,终止频率,中心频率,频率宽度,最小功率和最大功率设置
支持ToolTip鼠标悬停显示频谱信息
支持暂停/播放操作
平移,缩放,适配等操作
支持显示Fps(刷新率)
五、性能和实现
具体实现和数据如下参考文章
演示:基于WPF的DrawingVisual开发的频谱图和律动图_差值均分-CSDN博客
另外对于密集的点可以使用低分辨率的位图进行渲染来提升帧率,总之,制作高刷新的示波图可以从如下方面优化:
1、降低数据点数量;
2、提高硬件尤其是GPU配置;
3、采用高性能的绘图方式;
4、读写分离、渲染线程和更新数据线程分离;
5、动静分离、静态坐标轴、网格等数据和动态曲线数据分层渲染;
6、重复的数据应该应用缓存,避免重复创建;
7、可以冻结的资源应用冻结提升性能;
8、虚拟化截取掉不需要渲染的区域;
9、尽量缩小显示的范围,越小刷新效果越好;
10、注意细节,比如尽量减少使用虚线,实际中过多的虚线会大大消耗渲染性能;
总之影响性能的因素很多,而可能任意一种都会使渲染效果不理想,所以要注意细节,逐一隔离各种影响性能的因素去调试哪些影响到绘制性能,其他待补充...
六、演示视频
【WPF-Spectrum】高刷新率示波器_哔哩哔哩_bilibili
注:录制视频工具实际是25帧/秒,而实际渲染速度大概在50-60 帧/秒
需要了解的知识点
DrawingContext Class (System.Windows.Media) | Microsoft Learn
System.Windows.Controls 命名空间 | Microsoft Learn
控件库 - WPF .NET Framework | 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
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