游戏
长期以来,Linux 一直被认为是“非官方”的游戏平台;大多数游戏组织并未将其作为主要优先事项来提供支持和目标受众。这种情况从 2021 年开始加速变化,Valve、CodeWeavers 集团和社区等大型参与者对生态系统进行了巨大的改进,使 Linux 真正成为一个可行的游戏平台。此外,越来越多的独立开发团队努力使用跨平台渲染引擎,以便他们的游戏能够在 Linux 上编译和运行。
在游戏方面,大多数用户的想法通常都集中在流行的 AAA 游戏上,这些游戏通常是专门为 Microsoft Windows 平台编写的。这是可以理解的,但这并不是唯一的可用性。请参阅本页下方的 #Game_environments 和 #Getting_games,您可以在其中找到运行来自其他平台的游戏的软件。
但是,如果您专注于让为 Microsoft Windows 编写的游戏在 Linux 上运行,那么就需要不同的思维方式、工具和方法;理解内部原理并提供功能替代。请阅读下面的 #Game_technicality。
游戏技术性
尝试在 Linux 上玩为 Windows 制作的 AAA 游戏最终会出现三个复杂问题。它们是
- 图形 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 不是模拟器)[提供“加载器 VM”、自行编写的依赖项、互操作等]
- Proton(Valve 分支的 Wine 项目,针对 Steam 进行了优化)
- Mono(.NET 替代品)
- MF-Media(媒体基础依赖项)
例如,对 DirectX 上加载、转换和着色顶点的调用可以在 Wine 拥有的新的 .dll/.so 中从头开始重写,提供他们自己对底层函数可能执行的操作的“假设”信念,并将其转发到 OpenGL 替代方案,从而有效地尝试实现类似的结果。由于这些调用是直接等效的并且被视为“好像”DirectX 正在运行,因此性能不会受到影响。(除了与这些互操作的启动开销)
这些工具通常在分发版中同时引入到系统中。创建一个前缀(Wine 对模仿 Windows 沙箱的目录的术语)并进行配置。依赖项安装在前缀内部(“沙箱”仍然需要游戏的 redistributables),通常使用 winetricks,然后尝试运行游戏“好像”它是从 Windows 执行的一样。
如今,这对于大多数游戏都有效(除了反作弊保护的游戏,这些游戏需要 Wine/Proton 尚未拥有的内核驱动程序)。如果游戏无法运行,通常是由于软件包不兼容、缺少依赖项或 Wine/Proton 未实现的功能。
Lutris 是一款软件,如果您发现上述过程繁琐和/或复杂,它可以在您安装游戏时为您提供处理依赖项的运行器和沙箱。
常用游戏依赖
为了更深入地了解如果您决定走 Wine/Proton 路线您将要做什么,值得涵盖游戏执行所需的常见依赖项。架构也需要考虑在内,无论是 x86 还是 x64,最好两者都有。
前缀需要填充以下内容才能运行大多数 Windows 游戏。
强制性(为了高覆盖率)
- Microsoft Core Fonts
- Microsoft Visual C++ 2015(2017 覆盖率最高,推荐)[2005、2008、2010、2012、2013、2015、2017-2018、2019]
- DirectX 9.0(11.0 覆盖率最高,推荐)[2010 年 6 月 SDK 更新] {其中包括,仅举几例:}
- Direct3D
- Direct2D
- DirectShow
- DirectInput
- DirectPlay
- DirectSound
- DXGI
- XAudio2
- .NET Framework(3.5 覆盖率最高)
- OpenGL
- OpenAL
- OpenAI
- OpenCL
- Vulkan
可选(但仍然常见)
罕见(不太常见)
- Gamespy
- MIDI 驱动程序
- ACDSee
机器要求
仅仅填充游戏需要的依赖项的前缀是不够的。内核本身必须具有它将提供给游戏将进行的调用的替代项。如前所述,驱动程序和替代品是可用的。
驱动程序
- AMD 驱动程序:请参阅 AMDGPU。
- Intel 驱动程序:请参阅 Intel graphics。
- NVIDIA 驱动程序:请参阅 NVIDIA。
机器依赖性与替代品
游戏环境
Wine/Proton 并不是玩游戏的唯一方法。存在不同的环境可以在 Linux 中玩游戏,并且拥有与 Windows 一样多(或更多)的游戏
- 原生 – 具有针对 Linux 平台的构建版本,并附带 OpenGL 和/或 Vulkan 图形 API 支持的游戏。
- 模拟器 – 运行为其他架构和系统设计的软件所必需。大多数游戏在将 ROM 馈送到模拟器后即可立即运行,并且很少遇到问题。有关选项,请参阅 电子游戏平台模拟器。
- Java - 一次编写,到处运行平台。在 Linux 上运行的流行游戏示例有 Minecraft、Runescape、Wurm Online、Puzzle Pirates。
- Web – 在 Web 浏览器中运行的游戏。
- HTML5 游戏使用 canvas 和 WebGL 技术,可在所有现代浏览器中运行。
- Flash-based – 您需要安装插件才能玩。
- Wine – Windows 兼容层,允许在类 Unix 操作系统上运行 Windows 应用程序(和许多游戏)。通过添加 Wine#DXVK,支持运行时 DirectX 到 Vulkan 的转换,这提高了仅支持 DirectX 的游戏的性能。
- 虚拟机 – 可用于安装兼容的操作系统(例如 Windows)。VirtualBox 具有良好的 3D 支持。作为其扩展,如果您有兼容的硬件,您可以考虑将 VGA 直通到 Windows KVM 虚拟机,关键字是 “virtual function I/O” (VFIO),或 通过 OVMF 的 PCI 直通。
- Proton/DXVK – 为在专有的 steam 平台中使用而设计的 Wine 分支,与 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 预先打包的。
有关 Arch 中在官方存储库或 AUR 中打包的游戏列表,请参阅游戏列表。
- Athenaeum — Steam 的自由替代品。
- Flathub — 中央 Flatpak 存储库,具有小但不断增长的游戏部分。
- GOG.com — 无 DRM 游戏商店。可以通过离线安装脚本(使用基于 gtk2 的 UI 或从终端运行)、通过 Galaxy 客户端(需要 Wine)或通过非官方客户端安装游戏。
- https://www.gog.com || lgogdownloaderAUR, wyvernAUR, minigalaxyAUR
- Heroic Games Launcher — GOG 和 legendary 的 GUI,Epic Games Launcher 的开源替代品。
- itch.io — 独立游戏商店。
- Legendary — Epic Games Launcher 的免费开源替代品。
- Lutris — 适用于 Linux 的开放游戏平台。从 GOG、Steam、Battle.net、Origin、Uplay 和许多其他来源获取游戏。Lutris 利用各种游戏运行器来启动具有完全可自定义配置选项的游戏。
- Modrinth App — 独特的开源启动器,可让您玩自己喜欢的模组,并使它们保持最新,所有功能都集成在一个简洁的小软件包中。
- Play.it — 自动化原生软件包的构建。还支持 Wine、DOSBox 和 ScummVM 游戏。
- portproton — 用于玩 Microsoft Windows 游戏和启动器的软件
- Proton — 基于 Wine 和其他组件的 Steam Play 兼容性工具
- https://github.com/ValveSoftware/Proton || protonAUR[broken link: package not found], proton-experimentalAUR[broken link: package not found]
- proton-ge-custom — 基于 Wine 和其他组件的 Steam Play 兼容性工具,GloriousEggroll 的自定义构建
- https://github.com/GloriousEggroll/proton-ge-custom || proton-ge-customAUR[broken link: package not found]
- Rare — legendary 的另一个 GUI,基于 PyQt5。
- Steam — Valve 开发的数字发行和通信平台。
- umu-launcher — 这是 Linux 上 Windows 游戏的统一启动器,用于在 Steam 外部使用修复程序运行 Proton
对于 Wine 包装器,请参阅 Wine#第三方应用程序。
游戏启动器
游戏启动器是用于管理和运行各种平台上的游戏的重要工具。下面是 Linux 上可用的不同游戏启动器的比较,特别关注它们的功能和兼容性。
名称 | 软件包 | 开源 | 支持 Wine | DLC 管理 | 跨平台 | ProtonDB 支持 | 依赖项 | 推荐 |
---|---|---|---|---|---|---|---|---|
Athenaeum | athenaeum-gitAUR | 是 | 否 | 是 | 是 | 是 | 无 | 是 |
Flathub | flatpak | 否 | 否 | 否 | 是 | 否 | Flatpak 运行时 | 否 |
GOG.com | lgogdownloaderAUR | 是 | 是 | 是 | 否 | 是 | Python 3 | 是 |
Heroic Games Launcher | heroic-games-launcherAUR | 是 | 是 | 否 | 否 | 是 | Qt 5 | 是 |
itch.io | itch-setup-binAUR | 是 | 否 | 否 | 是 | 是 | 无 | 是 |
Legendary | legendaryAUR | 是 | 是 | 否 | 否 | 是 | 无 | 是 |
Lutris | lutris | 是 | 是 | 是 | 是 | 是 | Python 3, Wine | 是 |
Modrinth App | modrinth-app-appimageAUR | 是 | 否 | 否 | 否 | 否 | 无 | 否 |
Play.it | play.itAUR | 是 | 是 | 否 | 否 | 否 | 无 | 是 |
portproton | portprotonAUR | 是 | 是 | 否 | 是 | 是 | 无 | 否 |
proton-ge-custom | proton-ge-customAUR[broken link: package not found] | 是 | 是 | 否 | 否 | 是 | 无 | 是 |
Rare | rareAUR | 是 | 是 | 否 | 否 | 否 | 无 | 否 |
Steam | steam | 否 | 是 | 是 | 是 | 是 | 无 | 是 |
umu-launcher | umu-launcher | 是 | 是 | 否 | 否 | 否 | 无 | 否 |
配置游戏
某些游戏或游戏类型可能需要特殊配置才能运行或按预期运行。在大多数情况下,游戏在 Arch Linux 中开箱即可使用,并且由于编译时优化,性能可能比其他发行版更好。但是,某些特殊设置可能需要一些配置或脚本才能使游戏尽可能流畅地运行。
多屏幕设置
运行多屏幕设置可能会导致全屏游戏出现问题。在这种情况下,运行第二个 X 服务器是一种可能的解决方案。对于 NVIDIA 用户,可以在 NVIDIA#使用 TwinView 玩游戏中找到解决方案。
键盘捕获
许多游戏会捕获键盘,明显地阻止您切换窗口(也称为 alt-tabbing)。
一些 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。请注意,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
选项,指向一个空目录。调整鼠标检测
对于需要极高鼠标技巧的游戏,调整鼠标轮询率可以帮助提高准确性。
使用 OpenAL 的双耳音频
对于使用 OpenAL 的游戏,如果您使用耳机,您可以使用 OpenAL 的 HRTF 滤波器获得更好的位置音频。要启用,创建
~/.alsoftrc
hrtf = true
或者,从 AUR 安装 openal-hrtf,并编辑 /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客户端或GOG上拥有游戏才能使用此服务。并非所有游戏都可用。 |
Moonlight | moonlight-qtAUR | 否 | 是 | 否 | 是 | 是 | 这只是一个客户端。主机必须使用GeForce Experience(仅限Windows)或 Sunshine(多平台)。 |
Parsec | parsec-binAUR | 是(实验性) | 仅限Windows | 否 | 是 | 是 | 云托管 不再可用[死链接 2023-05-06 ⓘ] |
VDI Stream Client | vdi-stream-clientAUR | 否 | 仅限Windows | 否 | 是 | 否 | 具有3D GPU加速和内置USB重定向的VDI客户端 |
Playkey | playkey-linuxAUR | ? | ? | ? | ? | ? | – |
PlayStation Now[死链接 2024-07-30 ⓘ] | 在 Wine 或 Steam 的 proton 下运行 | 否 | 否 | – | 否 | 是 | 在PC上玩PS4、PS3和PS2游戏。或者,您可以使用 模拟器。 |
PlayStation Remote Play | chiakiAUR | 否 | 是 | – | 是 | 是 | 在PC上玩来自PS4和/或PS5的游戏。 |
Rainway | 基于Web浏览器 | 是 | 仅限Windows | 否 | 是 | ? | – |
Shadow | shadow-techAUR | 否 | 否 | 是 | 是 | 是 | 控制器支持取决于基于IP的USB,目前仅支持AVC,不支持HEVC |
Steam Remote Play | 属于 steam 的一部分 | 否 | 是 | 否 | 否 | 是 | – |
Vortex[死链接 2024-01-29 ⓘ] | – | 是 | 否 | – | 否 | ? | – |
VNC | tigervnc 或 x11vnc | 否 | 是 | 否 | 是 | 否 | 通用远程桌面协议,但延迟应足够低,以便在LAN上用于游戏。有关游戏手柄支持,请参见 Gamepad#Gamepad over network。 |
xrdp | xrdpAUR | 否 | 是 | 否 | 是 | 否 | 另一种通用远程桌面协议,在配置 图形加速 后,同时具有OpenGL和Vulkan支持。推荐用于LAN上的游戏。有关游戏手柄支持,请参见 Gamepad#Gamepad over network。 |
X11转发 | openssh | 否 | 是 | 否 | 否 | 否 | 通过SSH和 VirtualGL 进行X转发支持OpenGL,适用于某些但并非所有游戏。有关游戏手柄支持,请参见 Gamepad#Gamepad over network。 |
Boosteroid | boosteroidAUR | 是 | 否 | 否 | 是 | 是 | 您必须在数字发行平台(Steam、EGS、Origin等)上拥有游戏才能使用此服务。并非所有游戏都可用。您需要注册(免费)才能查看完整的游戏列表。您需要购买订阅才能启动您在数字发行平台上拥有的游戏。 |
Blacknut | blacknut-appimageAUR 或 Blacknut AppImage | 是 | 否 | 否 | 是 | 是 | 您需要订阅才能使用此服务。并非所有游戏都可用。 |
提高性能
另请参见主文章:提高性能。对于Wine程序,请参见 Wine#性能。为了获得良好的游戏体验,需要低延迟、一致的响应时间(无抖动)和足够的吞吐量(帧每秒)。如果您有多个抖动较小的来源,它们有时可能会重叠并产生明显的卡顿。因此,在大多数情况下,最好稍微降低吞吐量以获得更一致的响应时间。
提高 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
并通过将其中一个回显到 current_clocksource 来在它们之间切换。在Zen 3系统上,使用 [5] 进行基准测试显示,tsc
的吞吐量比 hpet
或 acpi_pm
高约 50 倍。
tsc
不可靠时强制使用它会导致Firefox随机崩溃,因为它破坏了 clock_gettime(CLOCK_MONOTONIC)
[6] 的单调性,而Firefox依赖于此。使用风险自负!调整内核参数以获得响应时间一致性
您可以安装实时内核以默认获得一些优势(请参见 实时内核 文章),但这会降低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。启用zswap
# echo 1 > /sys/module/zswap/parameters/enabled
启用多代最近最少使用(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][21]
# 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
永久性地进行更改
通常,永久设置 内核参数 的建议是配置创建 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/module/zswap/parameters/enabled - - - - 1 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调度器在最大程度地减少缓冲区膨胀和提高交互性方面最有效 提高性能#调度算法。
减少网络上的缓冲区膨胀
您可以使用默认的 fq_codel 或改进的 cake 智能队列管理算法。它们可以通过 sysctl 设置。您的家用互联网路由器可能会导致缓冲区膨胀,这可以通过重新配置路由器、安装新的路由器操作系统或更换路由器来缓解(更多信息)。
这里 有一些测试网络缓冲区膨胀的简便方法。
改善PCI Express延迟
更改类似于CachyOS的PCI Express延迟 [22]。减少PCI-E客户端可以占用总线的最大周期数,声卡除外 [23]。请注意,这些设置与 专业音频#系统配置 冲突。
# 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-Cache和转换后备缓冲区条目。根据兄弟线程执行的操作,主线程的吞吐量会有所不同。即使进程调度器知道SMT,SMT也会降低进程调度器的公平性。
如果您禁用SMT,请在BIOS/UEFI中执行此操作以获得更好的单核性能。
为您的游戏设置 环境变量
LD_BIND_NOW=1
以避免需要在运行时加载程序代码(请参见 ld.so(8)),这会导致首次调用函数时出现延迟。不要为 startplasma-x11 或其他链接到系统上不再存在且程序永远不会调用的库的程序设置此项。如果是这种情况,程序会在启动时尝试链接不存在的共享对象而失败,从而很容易识别出此问题。大多数游戏都应该在此设置启用时正常启动。
实用程序
GameMode
GameMode 是守护进程和库的组合,允许游戏请求将一组优化临时应用于主机操作系统。这可以提高游戏性能。
Gamescope
Gamescope 是Valve的微型合成器,在Steam Deck上使用。其目标是提供一个专为游戏量身定制的隔离合成器,并支持许多以游戏为中心的功能。
ACO编译器
请参见 AMDGPU#ACO 编译器
减少DRI延迟
直接渲染基础设施(DRI)配置文件适用于所有DRI驱动程序,包括Mesa和Nouveau。您可以在 /etc/drirc
中系统范围地更改DRI配置,或在 $HOME/.drirc
中按用户更改。如果它们不存在,您必须首先创建它们。这两个文件使用相同的语法;这些选项的文档可以在 https://dri.freedesktop.org/wiki/ConfigurationOptions/ 找到。要通过禁用与垂直同步的同步来减少输入延迟,请添加以下内容
<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
Nice值
其次,nice值设置了哪些任务优先处理,按升序排列。建议大多数多媒体任务(包括游戏)使用-4的nice值
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,以及其他辅助程序
作为一般规则,游戏运行所需的任何其他进程都应将其nice值设置为高于游戏本身的级别。奇怪的是,Wine有一个称为反向调度的问题,当更重要的进程设置为更高的nice值时,它通常会受益。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支持的设备的完整列表,请参见 此页面。或者对于罗技设备,使用 solaar。
LED
您可以使用 openrgb 更改和操作各种RGB,有关当前支持的设备列表,请参见 [24]
另请参阅
- linux_gaming - reddit.com上的论坛,主题是Linux游戏,子页面:Wiki,FAQ。
- Linux Gaming Guide - 优化Linux游戏体验的不同技术的汇编。
- are we anti cheat yet 一个全面且众包的游戏列表,其中使用了反作弊及其与GNU/Linux或Wine/Proton的兼容性。
- proton db 众包的Linux兼容性报告