FPS 计与渲染性能剖析
Senzoukria 提供两个帧率读数:用 Ctrl+Shift+F 切换的全局计量条,以及价格轴旁按图表统计的计数器;此外还有一个渲染通道剖析器,其耗时在开发版本或手动开启后输出到控制台。
Senzoukria · 文档 · 更新于 2026 年 9 月
位置
- 全局计量条
- Ctrl+Shift+F 切换;该选择在重启之间保留
- 图表计数器
- 图表顶部、价格轴左侧,每 500 毫秒刷新
- 渲染锐度
- 设置 → 性能 → 1×、1.5× 或 2×;默认 1.5×
- 通道剖析输出
- 标记为 [fp-perf] 的控制台行,每秒一条,仅开发版本或手动开启
它做什么
全局 FPS 计量条是一个诊断用的小条,本意是打开三十秒看一个数字就好。它显示最近一秒的每秒帧数、这一秒内最差的一帧耗时(毫秒)、检测到的屏幕刷新率(挂载时测得的 60 个帧间隔的中位数),以及窗口重新获得焦点后,它在后台期间测得的平均和最低 FPS。最后这个数字回答的是:应用是不是被另一个程序压在后台节流了。当 Windows 请求减少动效时,小条会显示「动画已关闭(Windows)」,因为此时背景是被刻意冻结的。
图表计数器是另一种测量:自 2026 年 9 月起,它统计的是图表可见期间主线程实际交付到屏幕的帧数,而不是重绘次数。因此它跟随面板刷新率(60、100、144、240),只有在真正卡顿时才下降。重绘次数仍保留在 [fp-perf] 日志里的 painted= 字段中。超过一秒没有帧的暂停(例如图表被隐藏或窗口最小化)会重新开始测量,而不会被算作停滞;图表本身也只在有变化时才绘制,通过一个最多保留一个待处理帧、且在图表隐藏时不保留任何帧的帧循环实现。
读数与阈值
| 读数 | 绿色 | 黄色 | 红色 |
|---|---|---|---|
| 全局计量条(相对检测到的刷新率) | ≥ 刷新率的 92% | ≥ 70% | 低于 70% |
| 图表计数器(相对最近 10 次读数中的最佳值) | ≥ 近期峰值的 90% 且 ≥ 50 fps | ≥ 峰值的 70%,或 30 至 49 fps | 低于峰值的 70%,或低于 30 fps |
| 后台统计 | 最低值 ≥ 60 fps | 最低值低于 60 fps | — |
设置项
| 设置 | 默认值 | 改变什么 |
|---|---|---|
| 渲染锐度 | 1.5× | 画布像素比的上限。1× 会在 HiDPI 屏幕上把像素数减半;2× 最锐利也最吃性能。可选:1×、1.5×、2×。 |
| 性能模式 | 均衡 | 「性能」设为 1×,「均衡」设为 1.5×,「精细」设为 2×(并同时调整其他选项)。手动改动其中之一,模式即变为手动。 |
| 性能日志 | 正式版本中关闭 | 把 localStorage 的 senzoukria.perfLogs 设为 1 并重新加载,即可在正式版本上启用 [fp-perf] 控制台行。 |
渲染通道剖析
足迹渲染器的每一个绘制通道(单元格、分布图、GEX 价位、新闻标记、DOM 面板提交、React 提交)都通过一个共享的剖析器计时。画布每秒把它清空一次,并向控制台打印一行排序结果:每个通道的总毫秒数和平均毫秒数、最差的那个通道、React 提交次数以及 DOM 面板开销。剖析器不持有画布或 React 的引用,弹出窗口各有自己的实例,因此测量结果绝不会跨窗口混在一起。
这些日志在分发版本中是静默的,因为 WebView 控制台会保留写进去的内容,而连续数小时每秒一条日志是一笔内存开销。它们在 npm run dev 下开启,也可以用上面那个手动开关在用户机器上启用。
限制与陷阱
怎么读这些数字:
- 图表计数器会停下来,而不是报 0:图表被隐藏或窗口不活跃时,测量会暂停,并在下一帧从头开始。
- 颜色是相对于近期峰值的,因此同样是 120 fps,在 120 Hz 屏幕上显示为绿色,在 240 Hz 屏幕上则是琥珀色。
- 检测到的刷新率是帧间隔的中位数;在跟不上的机器上,它可能读出低于面板真实刷新率的值。
- 全局计量条运行自己的 requestAnimationFrame 循环;诊断之外请把它关掉。
- 后台测量需要窗口先失去焦点再回来;小条只显示最近一段后台时间的数据。
相关页面
其他语言版本
常见问题
- 怎样显示 FPS 计量条?
- 按 Ctrl+Shift+F。再按一次或点击 ✕ 可隐藏。状态保存在 senz.fpsMeter 下,并在下次启动时恢复。
- 在 144 Hz 显示器上,图表计数器显示 45 fps,这是什么意思?
- 意思是在图表可见的这一秒里,主线程交付了 45 帧,所以有什么东西拖住了它。颜色是相对的:绿色需要达到最近十次读数中最佳值的 90% 且不低于 50 fps,而低于 30 fps 无论屏幕如何都是红色。可以和全局计量条对照,后者是把动画循环与检测到的刷新率做比较。
- 渲染剖析的数字在哪里?
- 在开发者控制台里,以每秒一条的 [fp-perf] 行显示;它们在开发版本中可用,或者把 localStorage 的 senzoukria.perfLogs 设为 1 并重新加载后可用。