You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Monogame/XNA中FPS计算公式原理及相关疑问咨询

XNA FPS计算公式原理与Update/Draw时间疑问解答

一、FPS计算公式的推导原理

FPS(每秒帧数)的核心定义是每秒完成的画面绘制次数。反过来想,每完成一帧画面所花费的时间,就是相邻两帧之间的时间间隔——也就是代码里的gameTime.ElapsedGameTime.TotalSeconds。

举个实际例子:如果每帧耗时0.0167秒(约等于1/60),那1秒内能够完成的帧数就是1 ÷ 0.0167 ≈ 60,也就是60FPS。

从数学逻辑推导的话,FPS的基础公式是:

FPS = 总帧数 ÷ 总时间

当我们取单帧的时间间隔Δt时,总时间就是Δt,对应的总帧数是1,代入公式后就得到:

FPS = 1 ÷ Δt

这就是framerate = (1 / gameTime.ElapsedGameTime.TotalSeconds);这个代码的由来。

二、关于Update和Draw的ElapsedGameTime疑问

你提到文档说明gameTime.ElapsedGameTime.TotalSeconds是上次调用Update到当前的时间,疑惑为什么不用Draw方法的间隔——这个问题得结合XNA的游戏循环机制来看:

  • 默认固定时间步长模式(IsFixedTimeStep=true)
    XNA默认会让Update方法以固定频率调用(默认60次/秒),每次Update执行完成后会立刻调用Draw。这时候两次Draw之间的时间间隔,和两次Update之间的时间间隔完全一致,所以用Update的ElapsedGameTime计算出的FPS,和实际的Draw帧率是等同的。

  • 非固定时间步长模式(IsFixedTimeStep=false)
    如果关闭了固定时间步长,Update和Draw会尽可能频繁地交替执行,这时候两次Draw之间的间隔可能和Update的间隔不一致(比如Draw本身耗时较长)。这种情况下,要是你想精准计算Draw的帧率,确实应该单独记录每次Draw的时间戳,用当前Draw的时间减去上一次Draw的时间,得到真实的帧间隔后再计算FPS。

不过大多数开发场景下,用Update的ElapsedGameTime计算FPS已经足够,因为默认模式下两者完全同步,就算是非固定模式,这个数值也能近似反映游戏的运行帧率。

内容的提问来源于stack exchange,提问作者kubas126

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:22:13