教程:优化游戏性能
概述
开启 show-time-usage 界面。如果游戏刷新率(UPS)持续偏低,应当查看第一列中的大数字。如果游戏卡顿甚至停止,应当查看第三列中的大数字。
开启 "time usage" 界面

按F4键打开调试模式菜单。其中有很多选项,这里需要开启其中的3个:
- show-fps:在屏幕右上角显示帧率(FPS)和刷新率(UPS)。
- show-time-usage:在屏幕上显示游戏中诸多系统的运行情况及其对游戏性能的影响。本教程的大部分篇幅与如何解读这些信息相关。
- hide-mod-guis:有时模组的窗口和按钮可能会遮挡上一个选项提供的信息。本选项可以隐藏它们,以便阅读所有运行情况。
提示:要更容易地读取数字,可以打开地图界面并滚动到尚未探索的区域,这样信息可以在黑色背景上显示。
要了解更多关于调试模式选项和菜单设置的信息,请参阅:调试模式。
帧率和刷新率
首先需要查看的是屏幕右上角的帧率/刷新率计数器。
- 帧率(FPS)代表游戏中每秒显示的帧数,这与显卡渲染屏幕图像的工作量相关。如果帧率偏低,屏幕的刷新频率将会降低,但游戏速度仍会保持正常。
- 刷新率(UPS)代表游戏状态每秒更新的次数,这与变更游戏世界状态所需的计算量相关。如果刷新率偏低,游戏速度会降低,此时游戏会像“慢动作”一样运行。游戏系统会始终尽量保持在60的帧率和刷新率。
帧率永远不会高于刷新率。这会导致两种情况:
- 帧率低,刷新率高:问题主要在于图像处理。可以转到游戏的图像设置并调整其中的一些设置。升级显卡有助于解决这一问题。
- 帧率低,刷新率低:问题主要在于刷新率偏低,请根据本教程接下来的内容找出可能的原因,并尝试一些节约刷新率的方法。
深入了解 "time usage" 界面
运行方式
屏幕上会显示一些文本和数字,如下图所示:
每行都以如下格式显示:
系统名称: 平均值/最低值/最高值
这些数字的单位为毫秒/刻。刻是一个更新步进,对于刷新率而言,就像帧率中的“帧”。由于游戏系统的运行目标是60的刷新率,即60刻,因此计算每刻游戏状态的变化最多使用16.667毫秒的时间。如果实际使用的时间超过了这个值,则游戏的刷新率就将低于60。
每行中的3个数字是对应系统功能在最近100刻中耗时的平均值、最低值和最高值。
这些信息仅显示游戏中最近100刻的情况,这相当于不到2秒的游戏时间。如果性能问题仅在某些时候发生,或者在特定的游戏行为时发生,则需要在此时打开调试界面。如果问题发生得太快,可以截图以便稍后研究。也可以使用/perf-avg-frames 1000
命令将显示时间增加到1000刻(或其它数字)。
在了解上述信息代表的意义后,可以注意寻找信息中的大数字。如果经常遇到刷新率问题,注意查看平均值。另一方面,如果偶尔遇到严重卡顿或停止,则需要查看最高值。
记住,由于60的刷新率相当于16.667毫秒/刻,玩家可以将其视为1毫秒时间大约消耗3.5的刷新率。任何超过1毫秒的情况都值得注意,任何超过5毫秒的情况都代表着严重的运行问题。
当发现一些可以的大数字时,可以参考下表了解该行代表的功能,是否需要注意,以及如何解决问题:
重要的 "time usage" 界面命令
命令名称 | 说明 | 问题处理 |
---|---|---|
Last save | 上次存档所用的时间,这与刷新率无关。 | - |
Frame cycle | 渲染1帧所需的总时间。这个值不会低于16.667毫秒。这不会提供任何刷新率计数器没有提供的信息。 | - |
Wait For Update | 玩家的GPU等待世界更新的时间。这大约相当于下面的“Update”行,不用特别注意。 | - |
Render preparation(及其子行) | 与屏幕上帧的渲染有关。这是一项基于CPU的工作,会消耗刷新率。当玩家缩小视图或查看工厂中特别繁忙的部分时,这些值会增加。 | - |
Render (及其子行) | 与屏幕上帧的渲染有关。这是一项基于GPU的工作,会消耗帧率。当玩家缩小视图或查看工厂中特别繁忙的部分时,这些值会增加。 | - |
Flip[On/Off] | 显卡将帧渲染到后台缓冲区,将其与前台缓冲区交换并呈现到屏幕上所消耗的时间。方括号中的“On”或“Off”表示是否启用了垂直同步。 | 尝试开启或关闭垂直同步。 |
Sleep | 当处理1刻的内容耗时小于16.667毫秒时,游戏会暂时休眠。这是正常情况。如果此值大于0,那么说明游戏的刷新率达到了60。 | - |
Update | 这是深入研究问题的关键。此行内容仅与世界时钟有关,而与渲染屏幕帧无关。这通常占用了大部分的帧时间。 | 查看子行以获取更多详细信息。 |
Game update | 游戏的核心系统。 | 查看子行以获取更多详细信息。 |
Circuit networks | 信号网络相关。 | 减少运算器和信号网络的使用。 |
Transport lines | 传送带相关。 | 传送带刷新率的优化是一项超出本指南范围的黑科技。 |
Fluid manager | 流体管理器。 | 减少管道数量。如果可能,使用地下管道(只包含2个流体实体)替换3个或更长的管道。使用太阳能替代核能发电。 |
Heat manager | 热力管理器。 | 减少热力实体数量,例如使用太阳能替代核能发电。 |
Entity manager | 与实体相关。实体是游戏中许多物品的总成。这通常会是列表中最大的数字。 | 要深入了解,请继续阅读教程的下一部分。 |
Electric networks | 电力系统相关。 | 这些值尤其受到不同电网的数量影响,而非电网的规模。例如,一根没有接线的单独电线杆就是一个电网,而且会造成性能开销。 |
Trains | 列车相关。 | 使用更少但更长的列车。使用针对刷新率优化过的铁路系统。这也是一门高深的学问,超出了本指南的范围。 |
Chart update | 与地图区块的刷新有关,通常由雷达完成。 | 减少雷达数量。 |
Lua garbage incremental | 与模组脚本相关。 | 首先尝试解决 "Script update" 行中的问题。如果该行没有发现问题,但仍有很高的“Lua垃圾增量”开销,可以使用 "show-lua-object-statistics" 调试选项辅助查找创建和销毁大量Lua对象的模组。 |
Script update | 运行模组Lua脚本所需的时间。每个 "mod-XXX" 子行是运行对应模组脚本消耗的时间。 | 卸载有问题的模组。如果性能不如预期,可以考虑向模组作者提交错误报告。 |
隐藏的模组开销
在 "Script update" 部分显示的内容并非模组的全部系统开销!模组可能间接影响游戏核心系统的运行时间。例如:一个使火车频繁改道的模组可能会增加铁路的系统开销,而一个创建大量不同电网的模组可能会增加电网的系统开销。
深入了解 "entity time usage" 界面

回到调试设置菜单,启用show-entity-time-usage选项并禁用show-time-usage选项(后者可能会造成干扰)。
在此界面上,上一屏中"Entity manager"显示的系统开销会被分摊到每个实体类型单独显示。每行中的第一个数字是当前刻的时间开销,第二个数字是对应类型实体的活动数量。
多数行的内容都可以顾名思义,但有一些需要注意:
- AssemblingMachine(组装机):此处不仅显示组装机,而且包括所有需要指定配方(例如化工厂或炼油厂等,但不包含冶炼炉)的建筑。对于这一部分的系统开销而言,建筑的数量比起其运行速度更加重要。数量少但速度快的建筑(带有插件塔和插件)的系统开销将低于数量多而速度慢的建筑。
- Inserter(机械臂):使用更少的机械臂,并尽量减少它们的工作频率。例如使用分时运作的机械臂。
- Unit(单位):这是指撕咬虫和喷吐虫。移除它们可以减少系统开销。
如果玩家在这些部分已经没有可以优化的内容,则说明问题仅仅是由于工厂规模超过了电脑的处理能力。恭喜!