[思考] 用 PID 控制游戏帧率的可能性——没必要

很多游戏都提供了设置帧率的选项。某日,我对这一司空见惯的事实产生了好奇:怎样使帧率稳定在一个值上(附近)呢?

一年前我曾在贴吧发表过贴子,对帧率控制的问题进行了探讨。彼时我还没有学习过控制理论的知识,认为 “经典” 的帧率控制方法(在主循环中插入 sleep 语句)不够精确,无法适应复杂多变的游戏环境,相对地,应当使用 PID,实现更稳定、准确和快速的控制。

之所以说 “经典”,不是因为我对主流游戏引擎的帧率控制方法做了研究,而是因为我只知道这一种方法。不过,仅仅针对这一种方法,也有许多能分析的——其中最主要的问题是:它究竟是否合理?

现在我学过了控制理论,这才意识到之前的想法是多么的天真。

首先,要使用 PID得知道 "游戏程序" 的传递函数,不仅仅对于 PID 来说是这样——这是设计控制器必需的。有人说可以使用经验公式,比如先调 Kp,再调 Ki,等等。我没有使用过此类方法,虽然它们看起来的确很方便,但我个人更喜欢计算和推理,即,画出校正前系统的 Bode 图或 Nyquist 图,根据其当前的各项指标,如裕度等,来计算控制器的参数。

对于电力电子变换器来说,常见的输入有占空比和频率,输出是电压或电流。对于一个程序来说,输入是什么呢?我觉得应该是每帧的计算量 (workload),输出很简单,是我们想要的帧率。所谓传递函数,就是输入和输出之间的关系——并非像 “正相关” “负相关” 这样携带的信息量很小的关系,而是以微分方程组或差分方程组严格规定的、数学意义上的关系。

暂且不提如何量化 workload 的问题,仅仅是求出传递函数……我觉得很难求出能够描述这样抽象关系的方程组。

然后就是 workload 的量化。通过统计每帧调用机器指令的数量吗?不太现实。如果统计那些对性能有较大影响的函数的调用次数倒不是不行,但我认为这样做太简单了,无法很好地反映 “计算量” 这一概念。

在做出上述毫无收获的分析之后,我发现根本没必要做什么负反馈控制。像温控系统,是因为我们不能直接控制温度,只能控制加热装置间接地控制温度,所以才需要介入控制器来改进控制的效果。

这里不一样。通过简单的 sleep 我们就可以直接影响到帧率,公式为:

=1+sleep 

那还需要什么控制?

结论是:“经典” 方法非常合理,没必要使用 PID 控制。

posted @   ZXPrism  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示