游戏
Linux 长久以来被认为是一个“非官方”的游戏平台;大多数游戏组织并未将对它的支持作为首要关注点。从 2021 年起,这种情况加速改变,因为 Valve、CodeWeavers 集团和 开源社区 等大玩家对生态系统进行了巨大改进,使得 Linux 真正成为一个可行的游戏平台。此外,越来越多的独立开发团队努力使用跨平台渲染引擎,以便他们的游戏能够编译并在 Linux 上运行。
在游戏方面,大多数用户的想法常常集中在流行的 AAA 级游戏上,这些游戏通常是专门为 Microsoft Windows 平台编写的。这是可以理解的,但是,这并非唯一或全部的可用选择。请参阅页面下方的 #游戏环境 和 #获取游戏,您可以在那里找到运行其他平台游戏的软件。
如果您执意要在 Linux 上运行为 Microsoft Windows 编写的游戏,那么需要不同的思路、工具和方法;理解其内部机制并提供功能性替代。请参阅下文的 #游戏技术细节。
游戏技术细节
尝试在 Linux 上运行为 AAA 级游戏,它们为 Windows 编写,最终会遇到 *三个* 难题。它们是:
- 图形 SDK
- 为 Linux 不支持的 API(如 DirectX)编写和编译的游戏。
- 通用库依赖
- 游戏过程中进行通用操作所需的库,例如保存游戏、加载配置文件(例如 Microsoft Visual C++、MFC、.NET)。
- 不兼容的接口
- 除了上述框架之外,Windows 生成的二进制格式和编译代码还有一个进一步的问题,即 Linux 无法识别。
图形 SDK 将图形调用转发给底层的图形驱动程序,然后由图形驱动程序与 GPU 硬件进行通信。
大量游戏使用 DirectX 作为其主要驱动 SDK。Linux 本地仅支持 OpenGL 和 Vulkan。Linux 本身不支持 DirectX 或上述任何技术(Visual C++、MFC、.NET)。
相反,已经编写了几个开源的等效实现,它们试图提供*相同*的功能,最终从图形角度实现相同的结果。这些等效实现有它们“自己”编写的替代品,试图“重新发明”原始 SDK 调用可能实现的“黑盒”功能。流行的包括:
- Wine(Wine Is Not an Emulator)[提供“加载器 VM”,自写依赖,互操作等]
- Proton(Wine 的一个分支项目,由 Valve 针对 Steam 进行了优化)
- Mono(.NET 替代品)
- MF-Media(媒体基础依赖)
例如,一个在 DirectX 中加载、转换和着色顶点的调用,可能会在 Wine 拥有的新*.dll*/*.so*文件中从头开始重写,提供它们自己对该函数可能在底层做什么的“假设性”推测,然后将其转发给 OpenGL 的替代方案,从而有效地尝试实现类似的结果。由于这些调用是直接等效的,并且被“视为”DirectX 正在运行,因此性能不受影响(除了与它们进行互操作的启动开销)。
这些工具通常会同时安装到发行版中。创建一个*前缀*(Wine 的术语,用于模拟 Windows 沙盒的目录)并进行配置。依赖项安装在*前缀内*(“沙盒”仍需要游戏的 可再发行组件),通常使用 winetricks,然后尝试“像”从 Windows 执行一样运行游戏。
如今,对于大多数游戏来说,这幸运地奏效了(除了*受反作弊保护的游戏*,它们需要 Wine/Proton 尚不支持的内核驱动程序)。如果游戏无法正常工作,通常是由于不兼容的软件包、缺失的依赖项或 Wine/Proton 未实现的函数。
Lutris 是一款软件,可以在您安装游戏时为您处理依赖项的运行器和沙盒,如果您觉得上述过程繁琐和/或复杂。
常见游戏依赖
为了更深入地了解如果您决定走 Wine/Proton 路线需要做什么,值得涵盖游戏执行所需的常见依赖项。还需要考虑架构,无论是 x86 还是 x64,最好两者都考虑。
为了运行*大多数* Windows 游戏,前缀需要包含以下内容:
必需(高覆盖率)
- Microsoft Core Fonts
- Microsoft Visual C++ 2015(2022 版本覆盖率最高,推荐)[2005, 2008, 2010, 2012, 2013, 2015, 2017-2018, 2019, 2022]
- DirectX 9.0(11.0 版本覆盖率最高,推荐)[2010 年 6 月 SDK 更新] {其中包含,仅举几例:}
- Direct3D
- Direct2D
- DirectShow
- DirectInput
- DirectPlay
- DirectSound
- DXGI
- XAudio2
- .NET Framework(4.8 版本覆盖率最高)
- OpenGL
- OpenCL
- Vulkan
可选(但仍常见)
罕见(不常见)
- Gamespy
- MIDI 驱动程序
- ACDSee
机器要求
仅仅用游戏所需的依赖项填充前缀是不够的。内核本身也必须提供它将为游戏调用提供的替代方案。如前所述,已有相应的驱动程序和替代方案。
驱动程序
- AMD 驱动程序:请参阅 AMDGPU。
- Intel 驱动程序:请参阅 Intel graphics。
- NVIDIA 驱动程序:请参阅 NVIDIA。
机器依赖和替代品
游戏环境
Wine/Proton 不是玩游戏的唯一方法。存在不同的环境可以在 Linux 上玩游戏,并且拥有的游戏数量与 Windows 一样多(甚至更多)。
- 原生 – 针对 Linux 平台构建的游戏,附带 OpenGL 和/或 Vulkan 图形 API 支持。
- 模拟器 – 运行为其他架构和系统设计的软件所必需。一旦将 ROM 提供给模拟器,大多数游戏就可以开箱即用,很少遇到问题。选项请参阅 Video game platform emulators。
- Java – 一次编写,随处运行的平台。在 Linux 上运行的流行游戏示例包括 Minecraft、Runescape、Wurm Online、Puzzle Pirates。
- Web – 在网页浏览器中运行的游戏。
- HTML5 游戏使用 canvas 和 WebGL 技术,并在所有现代浏览器中运行。
- Flash-based – 您需要安装一个扩展才能玩。
- Wine – Windows 兼容层,允许在类 Unix 操作系统上运行 Windows 应用程序(以及许多游戏)。通过 Wine#DXVK 的添加,支持 DirectX 到 Vulkan 的运行时转换,这可以提高仅支持 DirectX 的游戏的性能。
- 虚拟机 – 可用于安装兼容的操作系统(如 Windows)。VirtualBox 具有良好的 3D 支持。作为此的扩展,如果您有兼容的硬件,可以考虑将 VGA 直通给 Windows KVM 客户机,关键词是 “虚拟功能 I/O” (VFIO),或 PCI passthrough via OVMF。
- Proton/DXVK – Wine 的一个分支,专为专有的 steam 平台设计,提供比 Wine 更好的游戏支持。有关更多信息,请参阅 Steam#Proton Steam-Play。
游戏兼容性
增加 vm.max_map_count
将 vm.max_map_count 设置为较低的值会影响某些游戏的稳定性和性能。因此,通过创建以下 sysctl 配置文件来永久增加其大小是可取的。
/etc/sysctl.d/80-gamecompatibility.conf
vm.max_map_count = 2147483642
/usr/lib/sysctl.d/10-arch.conf 设置,如果您使用其他文件,请确保它具有更高的优先级。请参阅 sysctl(8) § SYSTEM FILE PRECEDENCE。Arch Linux 默认使用值 **1048576** [1],Fedora 认为这是一个安全的值 [2]。这个默认值可能足以应对当前的游戏,因为增加该值主要是在 Arch 使用内核默认值 65530 时才重要 [3]。值为 **2147483642** (MAX_INT - 5) 是 SteamOS 中的默认值。
通过运行以下命令,在不重启的情况下应用更改
# sysctl --system
获取游戏
仅仅因为游戏适用于 Linux 并不意味着它们是原生的;它们可能预装了 Wine 或 DOSBox。
有关在 官方仓库 或 AUR 中为 Arch 打包的游戏列表,请参阅 List of games。
- Athenaeum — Steam 的免费替代品。
- Bottles — 使用 wine 和 proton 在 Linux 上轻松运行 Windows 软件。
- Flathub — 集中式 Flatpak 存储库,拥有少量但不断增长的游戏版块。
- https://www.gog.com || lgogdownloaderAUR, wyvernAUR, minigalaxyAUR
- Heroic Games Launcher — GOG 和 legendary 的图形界面,是 Epic Games Launcher 的开源替代品。
- itch.io — 独立游戏商店。
- Legendary — Epic Games Launcher 的免费开源替代品。
- Lutris — Linux 开源游戏平台。从 GOG、Steam、Battle.net、Origin、Uplay 等多种来源获取游戏。Lutris 利用各种 游戏运行器 以完全可定制的配置选项启动游戏。
- Modrinth App — 一款独特的开源启动器,可让您一次性玩转您喜欢的模组并保持更新。
- portproton — 用于在 Linux 上运行 Microsoft Windows 游戏和启动器的软件。
- proton-ge-custom — 基于 Wine 和附加组件的 Steam Play 兼容性工具,GloriousEggroll 的自定义构建。
- Rare — legendary 的另一个图形界面,基于 PyQt5。
- Steam — 由 Valve 开发的数字发行和通信平台。
- umu-launcher — 这是 Linux 上 Windows 游戏统一启动器,用于在 Steam 外运行带修复的 Proton。
有关 Wine 包装器,请参阅 Wine#Third-party applications。
游戏启动器
游戏启动器是在各种平台上管理和运行游戏的重要工具。以下是 Linux 上可用不同游戏启动器的比较,特别侧重于它们的功能和兼容性。
| 软件包 (Package) | 开源 | 支持 Wine | DLC 管理 | 跨平台 | ProtonDB 支持 | 依赖 | 推荐 |
|---|---|---|---|---|---|---|---|
| athenaeum-gitAUR | 是 | 否 | 是 | 是 | 是 | 无 | 是 |
| Flatpak | 否 | 否 | 否 | 是 | 否 | Flatpak 运行时 | 否 |
| lgogdownloaderAUR | 是 | 是 | 是 | 否 | 是 | Python 3 | 是 |
| heroic-games-launcherAUR | 是 | 是 | 是 | 是 | 是 | Qt 5 | 是 |
| itch-setup-binAUR | 是 | 否 | 否 | 是 | 是 | 无 | 是 |
| legendaryAUR | 是 | 是 | 否 | 否 | 是 | 无 | 是 |
| lutris | 是 | 是 | 是 | 是 | 是 | Python 3, Wine | 是 |
| modrinth-app-appimageAUR | 是 | 否 | 否 | 否 | 否 | 无 | 否 |
| play.itAUR | 是 | 是 | 否 | 否 | 否 | 无 | 是 |
| portprotonAUR | 是 | 是 | 否 | 是 | 是 | 无 | 否 |
| proton-ge-custom-binAUR | 是 | 是 | 否 | 否 | 是 | 无 | 是 |
| rareAUR | 是 | 是 | 否 | 否 | 否 | 无 | 否 |
| Steam | 否 | 是 | 是 | 是 | 是 | 无 | 是 |
| umu-launcher | 是 | 是 | 否 | 否 | 否 | 无 | 否 |
配置游戏
某些游戏或游戏类型可能需要特殊配置才能运行或按预期运行。大多数情况下,游戏在 Arch Linux 上可以开箱即用,并且由于编译时优化,性能可能优于其他发行版。然而,一些特殊设置可能需要一些配置或脚本才能使游戏尽可能流畅地运行。
多屏设置
运行多屏设置可能会导致全屏游戏出现问题。在这种情况下,运行第二个 X 服务器是一个可能的解决方案。对于 NVIDIA 用户,可以在 NVIDIA#Gaming using TwinView 中找到解决方案。
键盘捕获
许多游戏会捕获键盘,特别是阻止您切换窗口(也称为 alt-tab)。
某些 SDL 游戏(例如 Guacamelee)允许您通过按 Ctrl-g 来禁用捕获。
在单独的 X 服务器中启动游戏
在某些情况下,如上所述,运行第二个 X 服务器可能是必要或期望的。运行第二个 X 服务器有多个优点,例如更好的性能、通过 Ctrl+Alt+F7/Ctrl+Alt+F8 “标签”出游戏的能力、在游戏与图形驱动程序冲突时不会崩溃您的主要 X 会话(可能有未完成的工作)。新的 X 服务器将类似于 ALSA 的远程访问登录,因此您的用户需要属于 audio 组才能听到任何声音。
要启动第二个 X 服务器(以免费的第一人称射击游戏 Xonotic 为例),您可以简单地执行
$ xinit /usr/bin/xonotic-glx -- :1 vt$XDG_VTNR
通过使用单独的 X 配置文件可以进一步增强这一点
$ xinit /usr/bin/xonotic-glx -- :1 -xf86config xorg-game.conf vt$XDG_VTNR
提供备用的 xorg.conf 的一个好理由可能是,您的主要配置使用了 NVIDIA 的 Twinview,这会导致您的 3D 游戏(如 Xonotic)显示在多屏设置的中间,跨越所有屏幕。这是不希望的,因此建议启动一个带有备用配置的新 X,其中第二个屏幕被禁用。
/etc/X11 目录。使用 Openbox 为您的主目录或 /usr/local/bin 创建一个游戏启动脚本可能如下所示
~/game.sh
if [ $# -ge 1 ]; then
game="$(which $1)"
openbox="$(which openbox)"
tmpgame="/tmp/tmpgame.sh"
DISPLAY=:1.0
echo -e "${openbox} &\n${game}" > ${tmpgame}
echo "starting ${game}"
xinit ${tmpgame} -- :1 -xf86config xorg-game.conf || exit 1
else
echo "not a valid argument"
fi
在使其*可执行*后,您就可以执行
$ ~/game.sh xonotic-glx
/etc/X11/xorg.conf.d 中的配置,您还应该使用 -configdir 选项,指向一个空目录。调整鼠标检测
对于需要大量鼠标技巧的游戏(如射击游戏),调整鼠标轮询率可以帮助提高高端鼠标的精度。当从典型的 250 Hz - 500 Hz 轮询率提高到 1000 Hz 时,改进可能达到几毫秒,但超过 1000 Hz 的改进最多只能提高不到一毫秒。总的来说,延迟受到鼠标微控制器、固件和传感器质量的影响,目前延迟最低的鼠标不一定会超过 1000 Hz。
使用 OpenAL 进行双耳音频
对于使用 OpenAL 的游戏,如果您使用耳机,通过 OpenAL 的 HRTF 过滤器,您可能会获得更好的空间音频。要启用,请*创建*
~/.alsoftrc
hrtf = true
或者,从 AUR 安装 openal-hrtfAUR,并编辑 /etc/openal/alsoftrc.conf 中的选项。
对于 Source 引擎游戏,需要将游戏内设置 `dsp_slow_cpu` 设置为 `1` 以启用 HRTF,否则游戏将启用自己的处理。您还需要设置 Steam 使用原生运行时,或将其 openal.so 副本链接到您自己的本地副本。为了完整起见,还请使用以下选项
dsp_slow_cpu 1 # Disable in-game spatialiazation snd_spatialize_roundrobin 1 # Disable spatialization 1.0*100% of sounds dsp_enhance_stereo 0 # Disable DSP sound effects. You may want to leave this on, if you find it does not interfere with your perception of the sound effects. snd_pitchquality 1 # Use high quality sounds
调整 PulseAudio
如果您正在使用 PulseAudio,您可能希望调整一些默认设置以确保其正常运行。
启用实时优先级和负的 nice 值
PulseAudio 被构建为作为音频守护进程以实时优先级运行。然而,由于其锁定系统的安全风险,它默认被调度为一个常规线程。要进行调整,首先确保您属于 audio 组。然后,在 /etc/pulse/daemon.conf 中取消注释并编辑以下行
/etc/pulse/daemon.conf
high-priority = yes nice-level = -11 realtime-scheduling = yes realtime-priority = 5
并重启 PulseAudio。
使用更高质量的混音以获得更好的声音
Arch 上的 PulseAudio 默认使用 speex-float-1 进行通道混音,这被认为是“中低”质量的混音。如果您的系统可以处理额外的负载,您可以将其设置为以下之一
resample-method = speex-float-10
将硬件缓冲区与 Pulse 的缓冲区匹配
匹配缓冲区可以减少卡顿并略微提高性能。有关更多详细信息,请参阅 此处。
远程游戏
由于客户端硬件要求低,云游戏在过去几年中受到了广泛欢迎。唯一重要的是稳定的互联网连接(推荐使用以太网电缆或 5 GHz Wi-Fi),最低速度为 5–10 Mbit/s(取决于视频质量和帧率)。
有关使用不支持此功能的服务的网络上的游戏手柄,请参阅 Gamepad#Gamepad over network。
| 服务 | 安装程序 | 浏览器内客户端 | 使用您自己的主机 | 提供主机租赁 | 全面的桌面支持 | 控制器支持 | 备注 |
|---|---|---|---|---|---|---|---|
| Dixper | – | 是 | 仅限 Windows | ? | ? | ? | – |
| Reemo | reemod-binAUR | 仅限 Chromium 内核 | 是 | 是 | 是 | 仅限 Windows | 您还可以通过其网站上的下载部分使用官方安装脚本来安装该软件。 |
| Xbox Cloud | xbox-cloud-gamingAUR | 是 | 否 | 否 | 否 | 是 | 您需要 Game Pass Ultimate 才能使用 XCloud。 |
| GeForce Now | – | 是 | 否 | 否 | 是 | 是 | 您必须在 Steam、Epic Client 或 GOG 上拥有游戏才能使用此服务。并非所有游戏都可用。 |
| Moonlight | moonlight-qt | 否 | 是 | 否 | 是 | 是 | 这只是一个客户端。主机必须使用 GeForce Experience(仅限 Windows)或 Sunshine(多平台)。 |
| Parsec | parsec-binAUR | 是(实验性) | 仅限 Windows | 否 | 是 | 是 | – |
| Playkey | playkey-linuxAUR | ? | ? | ? | ? | ? | – |
| PlayStation Now[死链 2024-07-30—HTTP 404] | 在 Wine 或 Steam 的 Proton 下运行 | 否 | 否 | – | 否 | 是 | 在 PC 上玩 PS4、PS3 和 PS2 游戏。或者,您可以使用 视频游戏平台模拟器。 |
| PlayStation Remote Play | chiakiAUR | 否 | 是 | – | 是 | 是 | 在 PC 上玩您的 PS4 和/或 PS5 游戏。 |
| Rainway[死链 2025-03-15—域名未解析] | 基于 Web 浏览器 | 是 | 仅限 Windows | 否 | 是 | ? | – |
| Shadow (影子文件) | shadow-techAUR | 否 | 否 | 是 | 是 | 是 | 控制器支持依赖于 USB over IP,目前仅支持 AVC,不支持 HEVC。 |
| Steam 远程畅玩 | 属于 steam | 否 | 是 | 否 | 否 | 是 | – |
| Vortex[死链 2024-01-29—HTTP 404] | – | 是 | 否 | – | 否 | ? | – |
| VNC | tigervnc 或 x11vnc | 否 | 是 | 否 | 是 | 否 | 通用远程桌面协议,但延迟应该足够低,可以在局域网中用于游戏。有关游戏手柄支持,请参阅 Gamepad#Gamepad over network。 |
| xrdp | xrdpAUR | 否 | 是 | 否 | 是 | 否 | 另一个通用远程桌面协议,在配置 图形加速后,同时支持 OpenGL 和 Vulkan。推荐用于局域网游戏。有关游戏手柄支持,请参阅 Gamepad#Gamepad over network。 |
| X11 转发 | openssh | 否 | 是 | 否 | 否 | 否 | 通过 VirtualGL 进行 SSH 上的 X 转发支持 OpenGL,并适用于部分但非全部游戏。有关游戏手柄支持,请参阅 Gamepad#Gamepad over network。 |
| Boosteroid | boosteroidAUR | 是 | 否 | 否 | 是 | 是 | 您必须在数字发行平台(Steam、EGS、Origin 等)上拥有游戏才能使用此服务。并非所有游戏都可用。您需要注册(免费)才能查看完整的游戏列表。您需要购买订阅才能启动您拥有的数字发行平台上的游戏。 |
| Blacknut | blacknut-appimageAUR 或 Blacknut AppImage | 是 | 否 | 否 | 是 | 是 | 您需要订阅才能使用此服务。并非所有游戏都可用。 |
提升性能
另请参阅主文章:改善性能。对于 Wine 程序,请参阅 Wine#Performance。为了获得良好的游戏体验,需要低延迟、一致的响应时间(无抖动)和足够的吞吐量(每秒帧数)。如果您有多个具有轻微抖动的源,它们可能会偶尔重叠并产生明显的卡顿。因此,大多数时候,最好稍微降低吞吐量以获得更高的响应时间一致性。另一方面,如果您获得较低的平均 FPS 或游戏应用程序本身会产生 CPU 需求峰值,则最好增加原始吞吐量。
提高 clock_gettime 吞吐量
用户空间程序,尤其是游戏,会执行许多 clock_gettime(2) 调用来获取当前时间,用于计算游戏物理、FPS 等。可以通过运行以下命令查看时间使用情况:
# perf top
并查看 read_hpet(或 acpi_pm_read)的开销。
如果您不依赖于非常精确的计时器,您可以从 hpet(高精度事件计时器)或 acpi_pm(ACPI 电源管理计时器)切换到更快的 TSC(时间戳计数器)计时器。添加 内核参数
tsc=reliable clocksource=tsc
以使 TSC 可用并启用它。然后重启并运行以下命令确认时钟源:
# cat /sys/devices/system/clocksource/clocksource*/current_clocksource
通过运行以下命令查看所有当前可用的计时器:
# cat /sys/devices/system/clocksource/clocksource*/available_clocksource
并通过 echo 一个到 current_clocksource 来在它们之间切换。在 Zen 3 系统上,使用 [5] 进行基准测试显示 tsc 的吞吐量比 hpet 或 acpi_pm 高约 50 倍。
tsc 会导致 Firefox 随机崩溃,因为它会破坏 Firefox 所依赖的 clock_gettime(CLOCK_MONOTONIC) 的单调性[6]。请自行承担风险使用!调整内核参数以获得响应时间一致性
您可以安装实时内核以默认获得一些优势(请参阅 实时内核 文章),但它会牺牲 CPU 吞吐量并可能延迟中断处理。此外,实时内核与 nvidia-open-dkms 不兼容,并且不会更改 SCHED_NORMAL(也称为 SCHED_OTHER)进程的调度程序,这是默认进程调度类型。以下内核参数更改改进了实时内核以及其他内核(如默认的 Linux 内核)的响应时间一致性。
主动压缩(透明)大页分配会减少平均但未必是最大分配停顿。根据 内核文档(内部工作原理),禁用主动压缩因为它会引入抖动。
# echo 0 > /proc/sys/vm/compaction_proactiveness
减少水印提升因子,以便在内存碎片化的情况下只整理一个页块(64 位 x86 上为 2MB)。在内存碎片化事件之后,这有助于更好地将应用程序数据保留在最后一级处理器缓存中。
# echo 1 > /proc/sys/vm/watermark_boost_factor
如果您有足够的可用 RAM,请增加最小可用千字节数以避免内存分配停顿:[7][8]。不要将其设置低于 1024 KB 或高于您系统内存的 5%。保留 1GB。
# echo 1048576 > /proc/sys/vm/min_free_kbytes
如果您有足够的可用 RAM,请增加水印比例因子以进一步降低分配停顿的可能性(解释[9][10])。将水印距离设置为 RAM 的 5%。
# echo 500 > /proc/sys/vm/watermark_scale_factor
避免交换(锁定会引入延迟并使用磁盘 IO 的页面),除非系统没有更多可用内存。
# echo 10 > /proc/sys/vm/swappiness
确保 zswap 已启用。如果出现需要交换页面的情况,则 zswap 有助于减少与交换相关的卡顿。如果您没有交换分区,您可以使用 zram 代替 zswap。
启用多代最近最少使用(MGLRU),但以轻微的性能成本降低锁争用的可能性[11]
# echo 5 > /sys/kernel/mm/lru_gen/enabled
禁用区域回收(锁定和移动会引入延迟峰值的内存页面)。
# echo 0 > /proc/sys/vm/zone_reclaim_mode
禁用透明大页(THP)会带来性能损失。即使禁用了碎片整理,THP 也可能引入延迟峰值[12][13][14]。仅当应用程序通过使用 madvise 和 advise 明确请求时才启用。
# echo madvise > /sys/kernel/mm/transparent_hugepage/enabled # echo advise > /sys/kernel/mm/transparent_hugepage/shmem_enabled # echo never > /sys/kernel/mm/transparent_hugepage/defrag
请注意,如果您的游戏使用 TCMalloc(例如 Dota 2 和 CS:GO),则不建议禁用 THP,因为它会带来巨大的性能成本[15]。
降低最大页面锁定获取延迟,同时保持足够的吞吐量[16][17][18]
# echo 1 > /proc/sys/vm/page_lock_unfairness
调整调度程序设置。以下调度程序设置与 cfs-zen-tweaksAUR 冲突,因此对于每个设置,请仅选择一个提供商。默认情况下,Linux 内核调度程序针对吞吐量而非延迟进行优化。以下手动设置会改变这一点,并已在不同游戏中进行了测试,证明有明显改进。它们可能不是您用例的最佳选择;请根据需要进行修改[19][20]
# echo 0 > /proc/sys/kernel/sched_child_runs_first # echo 1 > /proc/sys/kernel/sched_autogroup_enabled # echo 3000 > /proc/sys/kernel/sched_cfs_bandwidth_slice_us # echo 3000000 > /sys/kernel/debug/sched/base_slice_ns # echo 500000 > /sys/kernel/debug/sched/migration_cost_ns # echo 8 > /sys/kernel/debug/sched/nr_migrate
此外,建议测试不同的调度器,如 Improving_performance#CPU scheduler 中所述。例如,来自 scx-scheds 的 scx_cosmos 调度器在提高响应时间一致性方面表现出潜力,因为它优化了任务与 CPU 的局部性(增强了运行间的缓存命中一致性),减少了锁竞争,并且适合一般使用场景,在负载下优先处理交互式任务。类似地,scx_lavd 专门为提供一致的游戏性能而优化。您应该测试不同的调度器,以确定哪种最适合您的工作负载。
使更改永久生效
通常,永久设置 内核参数 的建议是配置创建一个 sysctl 配置文件或更改您的 引导加载程序 选项。但是,由于我们的更改跨越了 procfs(/proc,包含 sysctl)和 sysfs(/sys),最方便的方法是使用 systemd-tmpfiles。
/etc/tmpfiles.d/consistent-response-time-for-gaming.conf
# Path Mode UID GID Age Argument w /proc/sys/vm/compaction_proactiveness - - - - 0 w /proc/sys/vm/watermark_boost_factor - - - - 1 w /proc/sys/vm/min_free_kbytes - - - - 1048576 w /proc/sys/vm/watermark_scale_factor - - - - 500 w /proc/sys/vm/swappiness - - - - 10 w /sys/kernel/mm/lru_gen/enabled - - - - 5 w /proc/sys/vm/zone_reclaim_mode - - - - 0 w /sys/kernel/mm/transparent_hugepage/enabled - - - - madvise w /sys/kernel/mm/transparent_hugepage/shmem_enabled - - - - advise w /sys/kernel/mm/transparent_hugepage/defrag - - - - never w /proc/sys/vm/page_lock_unfairness - - - - 1 w /proc/sys/kernel/sched_child_runs_first - - - - 0 w /proc/sys/kernel/sched_autogroup_enabled - - - - 1 w /proc/sys/kernel/sched_cfs_bandwidth_slice_us - - - - 3000 w /sys/kernel/debug/sched/base_slice_ns - - - - 3000000 w /sys/kernel/debug/sched/migration_cost_ns - - - - 500000 w /sys/kernel/debug/sched/nr_migrate - - - - 8
之后,重新启动并查看值是否已正确应用。
减少缓冲膨胀
当大型缓冲区排队请求时,设备会发生缓冲膨胀,导致新请求被阻塞很长时间。发送和接收数据时都可能发生这种情况。
通过智能队列算法(为设备提供公平且及时的共享)来解决缓冲膨胀。智能队列算法产生更快、更一致的响应时间,但会增加 CPU 开销。对于交互式工作负载,减少缓冲膨胀是可取的。
减少存储设备的缓冲膨胀
对于存储设备,BFQ 调度程序在最小化缓冲膨胀和提高交互性方面最有效(请参阅 Improving performance#The scheduling algorithms)。
减少网络的缓冲膨胀
您可以使用默认的 fq_codel 或改进的 cake 智能队列管理算法。它们可以通过 sysctl 设置。您的家庭互联网路由器可能会导致缓冲膨胀,可以通过重新配置它、安装新的路由器 OS 或更换路由器来缓解(更多信息)。
在这里 可以找到一些测试网络缓冲膨胀的简单方法。
提高 PCI Express 延迟
更改 PCI Express 延迟,类似于 CachyOS [21]。减少 PCI-E 客户端可以占用总线的最大周期数,声卡除外[22]。请注意,这些设置与 Professional audio#Optimizing system configuration 冲突。
# setpci -v -s '*:*' latency_timer=20 # setpci -v -s '0:0' latency_timer=0 # setpci -v -d "*:*:04xx" latency_timer=80
为了在系统启动时一致地启用这些设置,请以超级用户身份运行它们。
禁用同时多线程 (SMT)
禁用 SMT 是否能改善您的游戏体验取决于您的硬件和游戏应用程序。
SMT 的优点
- 如果您的应用程序可以利用额外的线程,则总吞吐量更高。
- 为调度程序提供更多的运行队列,因此平均而言,进程线程等待被调度到核心的时间更短。
禁用 SMT 的优点
- 由于无需共享核心内部资源,并且内核和固件能够禁用 SMT 相关的安全缓解措施,因此单核性能更高。
- 更一致的单核性能。根据处理器的微架构,SMT 会共享各种处理器内部资源,如指令解码单元、微操作缓存、寄存器重命名功能、L1、L2 缓存和转换查找缓冲区条目。根据同胞线程的操作,主线程的吞吐量会发生变化。即使进程调度程序意识到 SMT,SMT 也会降低进程调度程序的公平性。
如果禁用 SMT,请在 BIOS/UEFI 中禁用它以提高单核性能。(SMT 共享 CPU 内部资源的示例:[23])
立即加载共享对象以获得更好的首次延迟
设置 环境变量
LD_BIND_NOW=1
用于您的游戏,以避免在运行时加载程序代码(请参阅 ld.so(8)),这会在第一次调用函数时导致延迟。不要为 startplasma-x11 或其他链接了系统中不再存在且程序从未调用的库的程序设置此项。如果是这种情况,程序将在启动时因尝试链接不存在的共享对象而失败,从而使此问题易于识别。大多数游戏在启用此设置后应该可以正常启动。由于官方仓库中的软件包默认使用 RELRO [24] 构建,因此只有来自其他来源的软件包会受到首次延迟的影响,链接中的错误仍可能触发。
工具
GameMode
GameMode 是一个守护进程和库的组合,它允许游戏请求一套优化暂时应用于主机操作系统。这可以提高游戏性能。
Gamescope
Gamescope 是 Valve 的一个微型合成器,用于 Steam Deck。其目标是提供一个隔离的合成器,该合成器专为游戏而设计并支持许多以游戏为中心的功能。
ACO 编译器
请参阅 AMDGPU#ACO 编译器。
减少 DRI 延迟
Direct Rendering Infrastructure (DRI) 配置文件适用于所有 DRI 驱动程序,包括 Mesa 和 Nouveau。您可以在系统范围内通过 /etc/drirc 或按用户在 $HOME/.drirc 中更改 DRI 配置。如果它们不存在,您需要先创建它们。这两个文件使用相同的语法;有关这些选项的文档可以在 https://dri.freedesktop.org/wiki/ConfigurationOptions/ 找到。要通过禁用与 vblank 的同步来减少输入延迟,请添加以下内容:
<driconf>
<device>
<application name="Default">
<option name="vblank_mode" value="0" />
</application>
</device>
</driconf>
通过调度策略提高帧率和响应能力
如果内核能够正确地为游戏设置调度策略以优先处理任务,大多数游戏都会从中受益。理想情况下,这些策略应该由应用程序本身按线程设置。
对于不自行实现调度策略的程序,名为 schedtool 的应用程序及其关联的守护进程 schedtooldAUR 可以自动处理许多这些任务。
要编辑哪些程序获得哪些策略,只需编辑 /etc/schedtoold.conf 并添加程序以及所需的 schedtool 参数。
策略
SCHED_ISO(仅在 -pf 和 -ck 内核中找到的 BFS/MuQSSPDS 调度程序中实现)– 不仅允许进程使用最多 80% 的 CPU,还会尽可能尝试减少延迟和卡顿。大多数(如果不是全部)游戏将受益于此。
bit.trip.runner -I
SCHED_FIFO 提供了一种替代方案,效果可能更好。您应该测试您的应用程序是否在 SCHED_FIFO 下运行更流畅,如果是,则请务必使用它。但请注意,SCHED_FIFO 有使系统饿死的风险!在下面使用 -I 的情况下使用此选项。
bit.trip.runner -F -p 15
优先级级别
其次,优先级级别设置了哪些任务首先被处理,按升序排列。对于大多数多媒体任务(包括游戏),建议设置为 -4。
bit.trip.runner -n -4
核心亲和性
关于驱动程序应该是多线程还是程序应该是多线程,开发中存在一些困惑。同时让驱动程序和程序多线程可能导致性能显著下降,例如帧率损失和崩溃风险增加。例如,许多现代游戏,以及任何使用 GLSL 启用的 Wine 程序。要选择单个核心并仅允许驱动程序处理此过程,只需使用 -a 0x# 标志,其中 # 是核心编号,例如:
bit.trip.runner -a 0x1
使用第一个核心。
有些 CPU 是超线程的,只有 2 或 4 个核心但显示为 4 或 8 个,并且最好处理为:
bit.trip.runner -a 0x5
使用虚拟核心 0101,或 1 和 3。
一般情况
对于大多数需要高帧率和低延迟的游戏,使用所有这些标志似乎效果最好。亲和性应按程序检查,因为大多数原生游戏可以理解正确的用法。一般情况:
bit.trip.runner -I -n -4 Amnesia.bin64 -I -n -4 hl2.exe -I -n -4 -a 0x1 #Wine with GLSL enabled
等等。
Optimus 和其他辅助程序
一般而言,游戏运行所需的任何其他进程都应以高于游戏本身的优先级运行。奇怪的是,Wine 有一个称为“反向调度”的问题,当更重要的进程设置为更高的优先级时,它通常会带来好处。Wineserver 也似乎无条件地受益于 SCHED_FIFO,因为它很少消耗整个 CPU,并且在可能时需要更高的优先级。
optirun -I -n -5 wineserver -F -p 20 -n 19 steam.exe -I -n -5
外设
鼠标
您可能希望将 鼠标加速设置为以更精确地控制鼠标。
如果您的鼠标有超过 3 个按钮,您可能需要查看 鼠标按钮。
如果您使用的是游戏鼠标(特别是 Logitech 和 Steelseries),您可能需要使用 piper 来配置您的鼠标 轮询率、DPI、LED 等。有关 piper 支持的设备完整列表,请参阅 此页面。对于 Logitech 设备,也可以使用 solaar。
LED 灯
您可以使用 openrgb 来更改和操纵各种 RGB。有关当前支持设备的列表,请参阅 [25]。
参见
- linux_gaming - reddit.com 上的论坛,主题为 Linux 上的游戏,子页面:Wiki,FAQ。
- Linux Gaming Guide - 汇集了优化 Linux 游戏体验的各种技术。
- are we anti cheat yet 一个全面且众包的游戏列表,包含使用反作弊系统的游戏及其与 GNU/Linux 或 Wine/Proton 的兼容性。
- proton db 众包的 Linux 兼容性报告。