游戏

出自 ArchWiki

长期以来,Linux 一直被认为是“非官方”的游戏平台;大多数游戏组织对其提供的支持和目标受众并非首要优先事项。从 2021 年起,这种情况的变化加速了,像 ValveCodeWeavers 集团和 社区 这样的大型参与者对生态系统进行了巨大的改进,使 Linux 真正成为一个可行的游戏平台。此外,越来越多的独立开发团队努力使用跨平台渲染引擎,以便他们的游戏能够在 Linux 上编译和运行。

在游戏方面,大多数用户的想法通常都指向流行的 AAA 游戏,这些游戏通常是专门为 Microsoft Windows 平台编写的。这是可以理解的,但这并不是唯一的可用性。请参考页面下方的 #游戏环境#获取游戏,您可以在那里找到运行其他平台游戏的软件。

但是,如果您执着于让为 Microsoft Windows 编写的游戏在 Linux 上工作,那么就需要不同的思维模式、工具和方法;理解内部原理并提供功能替代。请阅读下面的 #游戏技术性

游戏技术性

尝试在 Linux 上玩为 Windows 制作的 AAA 游戏 最终会产生三个复杂性。它们是

图形 SDK
为 Linux 无法识别的 API(例如 DirectX)编写和编译的游戏。
通用库依赖项
在游戏过程中进行通用操作所需的库,例如保存游戏内、加载配置文件(例如 Microsoft Visual C++、MFC、.NET)
不兼容的接口
除了上面提到的框架之外,Windows 生成的二进制格式和编译代码还存在 Linux 无法识别的进一步问题。

图形 SDK 将图形调用转发到基础图形驱动程序,然后驱动程序继续与 GPU 硬件对话。

大量游戏使用 DirectX 作为其主要驱动 SDK。Linux 原生仅支持 OpenGLVulkan。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 游戏。

强制性(为了高覆盖率)

本文或章节需要语言、wiki 语法或风格改进。有关参考,请参阅 Help:Style

原因: 此处应使用包含软件包链接的 wiki 文章的链接(例如 字体)(在 Talk:Gaming 中讨论)
  • 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

可选(但仍然常见)

  • XNA
  • PhysX
  • Media Foundation
  • Quicktime
  • Adobe Reader 11
  • Java SRE(例如,对于 Minecraft

罕见(不太常见)

  • Gamespy
  • MIDI 驱动程序
  • ACDSee

机器要求

仅仅用游戏需要的依赖项填充前缀是不够的。内核本身必须具有它将提供给游戏将进行的调用的替代项。如前所述,驱动程序和替代品是可用的。

驱动程序

机器的依赖项和替代品

注意: 这主要是信息性的。安装主要软件包后,其中一些软件包会自行安装。

游戏环境

Wine/Proton 不是玩游戏的唯一方法。存在不同的环境来在 Linux 中玩游戏,并且拥有与 Windows 一样多(或更多)的游戏

  • 原生 – 具有针对 Linux 平台的构建版本,并附带 OpenGL 和/或 Vulkan 图形 API 支持的游戏。
  • 模拟器 – 运行为其他架构和系统设计的软件所必需的。大多数游戏一旦将 ROM 馈送到模拟器中即可开箱即用,并且很少遇到问题。有关选项,请参阅 电子游戏平台模拟器
  • Java - 一次编写,到处运行平台。在 Linux 上运行的流行游戏示例包括 MinecraftRunescapeWurm OnlinePuzzle Pirates
  • Web – 在 Web 浏览器中运行的游戏。
    • HTML5 游戏使用 canvas 和 WebGL 技术,可在所有现代浏览器中使用。
    • Flash-based – 您需要安装插件才能玩。
  • Wine – Windows 兼容层,允许在类 Unix 操作系统上运行 Windows 应用程序(和许多游戏)。通过添加 Wine#DXVK,支持 DirectX 到 Vulkan 的运行时转换,这提高了仅支持 DirectX 的游戏的性能。
  • 虚拟机 – 可用于安装兼容的操作系统(例如 Windows)。VirtualBox 具有良好的 3D 支持。作为它的扩展,如果您有兼容的硬件,您可以考虑将 VGA 直通到 Windows KVM 虚拟机,关键词是 “虚拟功能 I/O”(VFIO),或 通过 OVMF 的 PCI 直通
  • 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
注意: 这可能会导致与尝试读取核心转储文件的旧程序不兼容 [4]

获取游戏

仅仅因为游戏可用于 Linux 并不意味着它们是原生的;它们可能是与 WineDOSBox 预先打包的。

有关为 Arch 打包在 官方仓库AUR 中的游戏列表,请参阅 游戏列表

  • Athenaeum — Steam 的自由替代品。
https://gitlab.com/librebob/athenaeum || athenaeum-gitAUR
  • Flathub — 中央 Flatpak 仓库,有小但不断增长的游戏区。
https://flathub.org/apps/category/Game || flatpak, discover, gnome-software
  • GOG.com — 无 DRM 游戏商店。可以通过离线安装脚本(使用基于 gtk2 的 UI,或从终端运行)、通过 Galaxy 客户端(需要 Wine)或通过非官方客户端安装游戏。
https://www.gog.com || lgogdownloaderAUR, wyvernAUR, minigalaxyAUR
  • Heroic Games Launcher — GOG 和 legendary 的 GUI,Epic Games Launcher 的开源替代品。
https://heroicgameslauncher.com/ || heroic-games-launcherAUR
https://itch.io || itch-setup-binAUR
  • Legendary — Epic Games Launcher 的免费开源替代品。
https://github.com/derrod/legendary || legendaryAUR
  • Lutris — Linux 的开放游戏平台。从 GOG、Steam、Battle.net、Origin、Uplay 和许多其他来源获取游戏。Lutris 利用各种 游戏运行器 以完全可自定义的配置选项启动游戏。
https://lutris.net || lutris
  • Modrinth App — 一款独特的开源启动器,可让您畅玩您最喜欢的模组,并使它们保持最新,所有功能都集中在一个简洁的小包中。
https://modrinth.com/app || modrinth-app-appimageAUR
  • Play.it — 自动化原生软件包的构建。还支持 WineDOSBox 和 ScummVM 游戏。
https://www.dotslashplay.it/ || play.itAUR
  • portproton — 用于玩 Microsoft Windows 游戏和启动器的软件
https://linux-gaming.ru/ || portprotonAUR
  • 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。
https://github.com/Dummerle/Rare || rareAUR
  • Steam — 由 Valve 开发的数字发行和通信平台。
https://store.steampowered.com || steam
  • umu-launcher — 这是 Linux 上 Windows 游戏的统一启动器,用于在 Steam 外部运行带有修复程序的 Proton
https://github.com/Open-Wine-Components/umu-launcher || umu-launcher

有关 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 来禁用捕获。

注意: 众所周知,SDL 有时可能无法捕获输入系统。在这种情况下,等待几秒钟后可能会成功捕获。

在独立的 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-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#通过网络的手柄

注意: 大多数在浏览器中运行的服务通常意味着仅与 google-chromeAUR 兼容。
服务 安装程序 浏览器内客户端 使用您自己的主机 提供主机租赁 完整桌面支持 控制器支持 备注
Dixper 仅限 Windows ? ? ?
Reemo reemod-binAUR 仅限基于 Chromium 仅限 Windows 您还可以通过其网站上的下载部分中的官方安装脚本安装该软件。
Xbox Cloud xbox-cloud-gamingAUR 您需要 Game Pass Ultimate 才能使用 XCloud。
GeForce Now 您必须在 Steam、Epic Client 或 GOG 上拥有游戏才能使用此服务。并非所有游戏都可用。
Moonlight moonlight-qtAUR 这只是一个客户端。主机必须使用 GeForce Experience(仅限 windows)或 Sunshine(多平台)。
Parsec parsec-binAUR 是 (实验性) 仅限 Windows 云托管 不再可用[死链 2023-05-06 ⓘ]
VDI 流客户端 vdi-stream-clientAUR 仅限 Windows 带有 3D GPU 加速和内置 USB 重定向的 VDI 客户端
Playkey playkey-linuxAUR ? ? ? ? ?
PlayStation Now[死链 2024-07-30 ⓘ] WineSteam 的 proton 下运行 在 PC 上畅玩 PS4、PS3 和 PS2 游戏。或者,您可以使用模拟器
PlayStation Remote Play chiakiAUR 在 PC 上畅玩来自 PS4 和/或 PS5 的游戏。
Rainway 基于网页浏览器 仅限 Windows ?
Shadow shadow-techAUR 控制器支持取决于基于 IP 的 USB,目前仅支持 AVC,因为不支持 HEVC
Steam Remote Play 属于 steam 的一部分
Vortex[死链 2024-01-29 ⓘ] ?
VNC tigervncx11vnc 通用远程桌面协议,但延迟应该足够低,以便在局域网 (LAN) 上用于游戏。有关手柄支持,请参阅手柄#通过网络使用手柄
xrdp xrdpAUR 另一种通用远程桌面协议,在配置图形加速后,同时支持 OpenGL 和 Vulkan。 推荐在局域网 (LAN) 上用于游戏。有关手柄支持,请参阅手柄#通过网络使用手柄
X11 转发 openssh 通过 SSH 和 VirtualGL 进行 X 转发,支持 OpenGL,适用于部分游戏,但并非全部。有关手柄支持,请参阅手柄#通过网络使用手柄
Boosteroid boosteroidAUR 您必须在数字发行平台(Steam、EGS、Origin 等)上拥有游戏才能使用此服务。并非所有游戏都可用。您需要注册(免费)才能查看完整的游戏列表。您需要购买订阅才能启动您在数字发行平台上拥有的游戏。
Blacknut blacknut-appimageAURBlacknut AppImage 您需要订阅才能使用此服务。并非所有游戏都可用。

提升性能

另请参阅主文章:提升性能。 对于 Wine 程序,请参阅 Wine#性能。 为了获得良好的游戏体验,需要低延迟、一致的响应时间(无抖动)和足够的吞吐量(帧每秒)。 如果您有多个抖动较小的来源,它们有时可能会重叠并产生明显的卡顿。 因此,大多数时候,最好稍微降低吞吐量以获得更一致的响应时间。

提高 clock_gettime 吞吐量

用户空间程序,尤其是游戏,会多次调用 clock_gettime(2) 以获取当前时间,用于计算游戏物理、帧率等。 可以通过运行以下命令查看时间使用情况

# perf top

并查看 read_hpet(或 acpi_pm_read)的开销。

如果您不依赖于非常精确的计时器,您可以从 hpet(高精度事件计时器)或 acpi_pm(ACPI 电源管理计时器)切换到更快的 TSC(时间戳计数器)计时器。 添加内核参数

tsc=reliable clocksource=tsc

使 TSC 可用并启用它。 之后重启并通过运行以下命令确认 clocksource

# cat /sys/devices/system/clocksource/clocksource*/current_clocksource

您可以通过运行以下命令查看所有当前可用的计时器

# cat /sys/devices/system/clocksource/clocksource*/available_clocksource

并通过将其中一个回显到 current_clocksource 来在它们之间切换。 在 Zen 3 系统上,使用 [5] 进行基准测试表明,tsc 的吞吐量比 hpetacpi_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 默认情况下被有意禁用,以防止卡顿。(在Talk:Gaming中讨论)

启用 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 延迟

更改 PCI Express 延迟,类似于 CachyOS [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 的优势

  1. 如果您的应用程序可以利用额外的线程,则总吞吐量更高
  2. 调度器有更多的运行队列,因此平均而言,进程线程在核心上获得调度的等待时间更少

禁用 SMT 的优势

  1. 由于无需共享核心内部资源以及内核和固件禁用 SMT 相关安全缓解措施的能力,因此单核性能更高
  2. 更一致的单核性能。 根据您处理器的微架构,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 驱动程序的 AMD GPU。

请参阅 AMDGPU#ACO 编译器

减少 DRI 延迟

直接渲染基础设施 (DRI) 配置文件适用于所有 DRI 驱动程序,包括 Mesa 和 Nouveau。 您可以在 /etc/drirc 中系统范围内更改 DRI 配置,或在 $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

Nice 级别

其次,nice 级别按升序设置哪些任务先处理。 建议大多数多媒体任务(包括游戏)的 nice 级别为 -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 和其他辅助程序

作为一般规则,游戏运行所需的任何其他进程都应重新设置 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 游戏为主题的论坛,子页面:WikiFAQ
  • Linux Gaming Guide - 优化 Linux 游戏体验的不同技术的汇编。
  • are we anti cheat yet 一个全面且众包的游戏列表,其中包含反作弊及其与 GNU/Linux 或 Wine/Proton 的兼容性。
  • proton db 众包 Linux 兼容性报告