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

WPF 如何像Avalonia那样显示帧率

背景

帧率是啥意思:Frame Person Seconds 每秒帧数。用白话讲就是--单位时间内画面刷新了多少次。
Avalonia打开开发者调试工具(快捷键F12),顶部菜单选择 overlays 勾选 FPS可以看到帧率:
fps

怎么在WPF中显示帧率呢?

参考两篇文章:
如何:使用 CompositionTarget 以每帧间隔呈现
[WPF] 使用Silk.NET绘制D3D9或OpenGL内容并完美解决空域问题

实现

CompositionTarget这个静态类,提供了一个事件:Rendering,每当WPF要绘制一帧前都会引发一下这个事件。
那么计算公式如下:
image

实现代码如下:

using System.Windows;
using System.Windows.Input;
using System.Windows.Media;namespace WpfApp1
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();CompositionTarget.Rendering += CompositionTarget_Rendering;this.MouseMove += MainWindow_MouseMove;}private TimeSpan _lastRenderTime;private List<int> _fpsSample = new List<int>();private void CompositionTarget_Rendering(object sender, EventArgs e){RenderingEventArgs args = (RenderingEventArgs)e;if (_lastRenderTime != args.RenderingTime){_fpsSample.Add(Convert.ToInt32(1000.0d / (args.RenderingTime.TotalMilliseconds - _lastRenderTime.TotalMilliseconds)));if (_fpsSample.Count == 30){var fps = Convert.ToInt32(_fpsSample.Average());framwPerSecondsLabel.Content = $"FPS: {fps}";_fpsSample.Clear();}_lastRenderTime = args.RenderingTime;}}private void MainWindow_MouseMove(object sender, MouseEventArgs e){var point=e.GetPosition(this);this.Background= new SolidColorBrush(Color.FromArgb(255, (byte)point.X, (byte)point.Y, 100));}}
}

界面代码

<Windowx:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:WpfApp1"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Title="MainWindow"Width="800"Height="450"mc:Ignorable="d"><StackPanel x:Name="panelCtrl"><Labelx:Name="framwPerSecondsLabel"Height="32"HorizontalContentAlignment="Center"VerticalContentAlignment="Center"FontSize="18"Foreground="Red" /></StackPanel>
</Window>

运行效果
show fps

WPF和Aalonia上限貌似都是:一秒60帧(FPS:60)

http://www.jsqmd.com/news/518864/

相关文章:

  • 从零开始DIY四足机器人:STM32F103C8T6主控+立创EDA设计全流程(附3D打印文件)
  • Nacos 2.1.1适配Oracle/达梦数据库实战:从驱动打包到分页语法改造全流程
  • 【超全】2026年OpenClaw在华为云上零门槛3分钟安装及使用步骤教程
  • VMware紧急安全更新:深度解析VMSA-2025-0004及CVE-2025-22224系列高危漏洞
  • 从创业失败到月入过万,格行科技有限公司的随身WiFi代理项目让我重新找到方向。本文分享我的经历,以及格行代理的优势、产品特点和招商政策,邀请码888886,助你轻松创业。 - 格行招商部总监张总
  • 全志平台双摄像头驱动配置指南:以RN6854M和NVP6158为例(含代码解析)
  • STM32 FSMC实战:如何用HAL库驱动LCD屏幕(附完整代码)
  • 史上最厉害的Java进阶之路
  • IAR Workspace实战:Debug与Release配置切换的5个隐藏技巧(附性能对比数据)
  • 计算机毕业设计springboot基于的宠物领养管理系统 基于SpringBoot框架的流浪动物救助与领养平台设计与实现 基于Java技术的宠物收容信息管理与领养服务系统开发
  • 20小时武器化!Langflow高危漏洞CVE-2026-33017:AI框架安全的“小时级危机”已至
  • Office 激活
  • AI设计工具满天飞,设计师会被取代吗?兰亭妙微:这3个短板AI永远追不上 - ui设计公司兰亭妙微
  • 计算机毕业设计springboot基于的宠物医院管理系统的设计与实现 基于SpringBoot框架的宠物诊疗服务平台设计与实现 基于Java Web技术的宠物医疗健康档案管理系统开发
  • 别再为FreeRTOSv2024.06的移植头疼了!STM32F103ZET6实战避坑全记录
  • RSAC 2026前瞻:AI热潮退去,安全运营的“现实拷问”终至
  • 智能时代伦理中间件的形态 ——各领域的显影与对话
  • Vivado时序约束实战:用Set Bus Skew搞定跨时钟域握手信号的那些坑
  • vue+python基于ai技术的学习资料分享平台
  • 全球AI数据安全规制博弈:格局、趋势与中国路径
  • 避坑指南:在Ubuntu 22.04上为CH341模块手动编译安装驱动(解决`usbserial`缺失问题)
  • Vue2项目动态配置后端API地址的实战技巧
  • USB设备开发避坑:描述符配置常见错误及排查方法
  • [CVPR 2024] DiffSample: Advancing Differentiable Point Cloud Sampling for Real-Time Applications
  • 从零开始用Firecracker构建轻量级安全容器:绕过KVM性能损耗的5个技巧
  • IDEA快捷键全攻略:从入门到精通,提升编码效率的50个必备技巧
  • Firecrawl本地部署避坑指南:从Docker版本选择到Dify调用的完整流程
  • Python进度条神器tqdm实战:如何在PyCharm终端完美显示两级进度条(附2024最新配置)
  • 实战解析:如何利用FreeRTOS高水位线精准优化任务栈空间
  • django基于Python的膳食营养健康系统 基于机器学习的个人健康饮食推荐系统