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

动态计算FPS(每秒帧数)的方法

动态计算FPS(每秒帧数)的方法

在数据处理循环中动态计算FPS(Frames Per Second)是一个常见的需求,特别是在实时系统、游戏开发或视频处理中。以下是几种实现方法:

基本方法

import time# 初始化变量
frame_count = 0
start_time = time.time()while True:# 处理数据或渲染帧process_data()frame_count += 1# 计算FPScurrent_time = time.time()elapsed_time = current_time - start_timeif elapsed_time > 1.0:  # 每1秒计算一次FPSfps = frame_count / elapsed_timeprint(f"FPS: {fps:.2f}")# 重置计数器frame_count = 0start_time = current_time

滑动窗口平均法(更平滑的FPS计算)

import time
from collections import deque# 使用滑动窗口记录最近N帧的时间戳
frame_times = deque(maxlen=60)  # 保留最近60帧的时间while True:# 处理数据或渲染帧process_data()# 记录当前帧时间frame_times.append(time.time())# 计算FPS(当有足够帧时)if len(frame_times) > 1:fps = len(frame_times) / (frame_times[-1] - frame_times[0])print(f"FPS: {fps:.2f}")

加权平均法(更注重最近帧率)

import time# 初始化变量
last_time = time.time()
smooth_fps = 0.0
alpha = 0.9  # 平滑因子(0.0-1.0),越大表示越重视最近的值while True:# 处理数据或渲染帧process_data()# 计算当前帧时间差current_time = time.time()delta_time = current_time - last_timelast_time = current_time# 计算瞬时FPSif delta_time > 0:current_fps = 1.0 / delta_time# 应用加权平均smooth_fps = alpha * smooth_fps + (1.0 - alpha) * current_fpsprint(f"FPS: {smooth_fps:.2f}")

低开销的简化方法

import timeframe_count = 0
last_report_time = time.time()while True:# 处理数据或渲染帧process_data()frame_count += 1# 每N帧报告一次FPSif frame_count % 30 == 0:  # 每30帧报告一次current_time = time.time()elapsed = current_time - last_report_timefps = 30 / elapsed  # 30帧 / 经过的时间print(f"FPS: {fps:.2f}")last_report_time = current_time

选择哪种方法取决于你的具体需求:

  • 基本方法简单直接,适合大多数情况
  • 滑动窗口法提供更平滑的结果
  • 加权平均法对最近的帧率变化更敏感
  • 简化方法开销最小,适合资源受限的环境

在实际应用中,你可能还需要考虑线程安全和性能优化等问题。

http://www.xdnf.cn/news/269.html

相关文章:

  • Jsp技术入门指南【六】jsp脚本原理及隐式对象
  • 关于AI提示工程的详解,分点说明其核心概念、关键技巧和应用场景
  • 语音合成之二TTS模型损失函数进化史
  • 极狐GitLab 项目和群组的导入导出速率限制如何设置?
  • Linux 文件查找终极指南:find, locate, grep 等命令详解
  • 18-算法打卡-哈希表-两数之和-leetcode(1)-第十八天
  • 智能体时代的产业范式确立,中国企业以探索者姿态走出自己的路
  • [密码学实战]详解gmssl库与第三方工具兼容性问题及解决方案
  • Python语言基础教程(上)4.0
  • 15.4K Star!Vercel官方出品,零基础构建企业级AI聊天机器人
  • 进程(转账,卖票)
  • C#核心笔记——(六)框架基础
  • 【MySQL】数据库和表的操作详解
  • 6.6 “3步调用ChatGPT打造高可靠Python调度器,零依赖实现定时任务自动化“
  • Linux工具学习之【vim】
  • 医学图像中的不同模态图像详细介绍
  • VirtualBox导入 .ova 文件出错,怎么解决
  • Java入门-Map双列集合
  • 通过C# 将Excel表格转换为图片(JPG/ PNG)
  • 51单片机实验七:EEPROM AT24C02 与单片机的通信实例
  • 《计算机视觉度量:从特征描述到深度学习》—工业检测大模型RAG白皮书
  • 12芯束装光纤不同包层线颜色之间的排列顺序
  • Linux 内核开发/测试工具对比 Windows 驱动验证工具 (Driver Verifier)
  • 从数据集到开源模型,覆盖无机材料设计/晶体结构预测/材料属性记录等
  • 70. 爬楼梯
  • 环境搭建与入门:Flutter SDK安装与配置
  • 《数据结构初阶》【时间复杂度 + 空间复杂度】
  • Echart 地图放大缩小
  • SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端
  • C++手撕STL-其一