切换语言: English

教程:优化游戏性能

From Official Factorio Wiki
Jump to navigation Jump to search

概述

开启 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" 界面

“entity time usage”界面

回到调试设置菜单,启用show-entity-time-usage选项并禁用show-time-usage选项(后者可能会造成干扰)。

在此界面上,上一屏中"Entity manager"显示的系统开销会被分摊到每个实体类型单独显示。每行中的第一个数字是当前刻的时间开销,第二个数字是对应类型实体的活动数量。

多数行的内容都可以顾名思义,但有一些需要注意:

  • AssemblingMachine(组装机):此处不仅显示组装机,而且包括所有需要指定配方(例如化工厂或炼油厂等,但不包含冶炼炉)的建筑。对于这一部分的系统开销而言,建筑的数量比起其运行速度更加重要。数量少但速度快的建筑(带有插件塔和插件)的系统开销将低于数量多而速度慢的建筑。
  • Inserter(机械臂):使用更少的机械臂,并尽量减少它们的工作频率。例如使用分时运作的机械臂。
  • Unit(单位):这是指撕咬虫和喷吐虫。移除它们可以减少系统开销。

如果玩家在这些部分已经没有可以优化的内容,则说明问题仅仅是由于工厂规模超过了电脑的处理能力。恭喜!