Python 现代开发学习笔记

(四)用经过时间推导移动距离

1. 每帧位移会跟着帧数改变

一帧是一次画面更新,FPS(frames per second)表示每秒的帧数。一个方块每帧向右走 4 像素:30 帧走 120 像素,60 帧走 240 像素,120 帧走 480 像素。相同一秒,在不同电脑上可能得到不同速度:

# 项目文件:demos/fps_math.py
# 对同样一秒计算位移:固定每帧4像素会随帧数改变,240像素/秒保持相同距离。
for fps in [30, 60, 120, 144]:
    per_frame, per_second = 0.0, 0.0
    for _ in range(fps):
        per_frame += 4
        per_second += 240 * (1 / fps)
    print(fps, "每帧累加", int(per_frame), "按秒计算", f"{per_second:.1f}")

输出中“每帧累加”分别为 120、240、480、576;“按秒计算”都为 240.0。原因是后者先确定速度为每秒 240 像素,再乘这一帧经过的秒数。

一秒中的帧数 每帧经过秒数 每帧按速度计算的位移 一秒累计
30 约 0.033333 8 像素 240 像素
60 约 0.016667 4 像素 240 像素
120 约 0.008333 2 像素 240 像素
144 约 0.006944 约 1.666667 像素 240 像素
同样一秒中按帧加四会得到不同距离,速度乘各帧秒数后总距离相同

2. Clock 把毫秒交给这一轮计算

clock.tick(60) 返回距离上一次 tick 的毫秒数,并通过等待限制循环节奏。除以 1000 得到秒,通常记为 dt。位置更新写为 位置 += 速度 × dt,单位就是 像素/秒 × 秒 = 像素。

60 是节奏目标,某一帧实际花了多少时间由返回值给出;clock.get_fps() 则观察一段时间内的平均帧率。完整游戏会进一步把显示帧率与固定逻辑步长分开,避免一次较长的显示帧直接跳过整个碰撞过程。Clock 与时间

笔记正文与全部题解 · Ctrl / ⌘ K