游戏 - Arch Linux 中文维基

跳转到内容

# 游戏

来自 Arch Linux 中文维基

相关文章

- 游戏列表
- 游戏机模拟器
- Xorg
- Gamepad
- Wine

翻译状态：

- 本文（或部分内容）译自 Gaming，最近一次同步于 2025-3-8，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

本文或本节需要翻译。要贡献翻译，请访问简体中文翻译团队。

附注： 部分内容缺少翻译为英文，需要跟进翻译（在 Talk:游戏# 中讨论）

Linux 曾被认为是“非官方”的游戏平台; 向其提供的支持和目标受众并不是大多数游戏组织的首要任务。 从 2021 年开始，这种情况的变化开始加速，这是因为像 Valve、CodeWeavers 组和 community 这样的大公司/组织的参与，他们给 Linux 的游戏生态带来了巨大的变化，让 Linux 真正成为一个可行的游戏平台。 此外，越来越多的独立开发团队努力使用跨平台渲染引擎，以使他们的游戏能够在 Linux 上编译和运行。

当谈到游戏时，大多数用户的想法往往指向流行的 AAA games，这些游戏通常是专门为 Microsoft Windows 平台编写的。 这是可以理解的，但这不是唯一的可能性。 请参阅页面下方的 #游戏环境和 #获取游戏，您可以在其中找到从其他平台运行游戏的软件。

然而，如果您执着于让为 Microsoft Windows 编写的游戏在 Linux 上运行，那么需要不同的思维方式、工具和方法； 了解内部结构并提供功能替代。 请阅读下面的 #游戏技术性。

## 游戏技术性

试图在 Linux 上玩 AAA games一般会出现三个难题。他们是：

图形软件开发工具包（SDK）
  在 Linux 上无法运行使用 Linux 无法识别的应用程序编程接口（API）（例如DirectX）开发的游戏。
通用库依赖
  在游戏过程中进行通用操作所需的库，例如保存游戏、加载配置。（例如 Microsoft Visual C++、MFC、.NET）。
不兼容的接口
  除了上面提到的框架之外，还有一个问题就是 Linux 系统无法直接识别以 Windows 系统为目标而生成的二进制格式和编译的代码。

图形SDK将图形调用转发到底层图形驱动程序，然后驱动程序继续与GPU硬件交互。

上面的 API 将它们的图形调用转发给底层驱动程序，然后驱动程序再继续与GPU硬件沟通。 幸运的是，AMD用户拥有AMD自己发布的开源驱动程序，这就已经解决了一个巨大的问题了。而Nvidia用户必须依赖其他替代品，这些替代品通常打包为二进制大型对象(blobs)。 （作为 Nvidia 驱动程序逆向工程的结果，才能以这样的方式使用微代码和固件）

大量的游戏使用了 DirectX 作为他们主要的驱动SDK. Linux仅能原生支持OpenGL 和 Vulkan。Linux自己本身无法支持DirectX或任何上述技术（Microsoft Visual C++、MFC、.NET）。

相反，有多个开源替代项目被开发出来提供相同的功能，最终从图形的角度实现相同的结果。这些项目有它们自己的成型替代品，它们试图从黑盒子的角度重新发明原始SDK调用可能实现的内容。受欢迎的包括：

- Wine (Wine Is Not an Emulator) [提供“加载器虚拟机”、自写依赖项、互操作性等]
- Proton (Wine项目的分支，是Valve 针对 Steam 进行了优化的版本)
- Mono (.NET框架的等效替代)
- MF-Media (多媒体基础依赖)

例如，在 DirectX 上加载、转换和着色顶点的调用可能会在 Wine 拥有的新 .dll/.so 中从头开始重写，提供他们自己关于功能可能在下面做什么的假设想法，并将其转发给 OpenGL 替代方案，有效地尝试实现类似的结果。 由于这些调用是直接等效的，并且可以看作好像正在运行DirectX，因此性能不会受到影响。（与这些互操作的起始开销除外）

这些工具往往同时被带入系统的发行版中。创建并配置了prefix（Wine 的术语，用于模拟 Windows 沙箱的目录）。依赖项被安装在prefix内（"沙盒"仍然需要游戏的可再发行程序库），通常和 winetricks 一起出现，以这样的方式去运行游戏，"就好像"它是在Windows上运行一样。

幸运的是，这套方案如今适用于大多数游戏（带有防作弊保护的游戏除外，这需要一个 Wine/Proton 还没有的内核驱动程序）。 如果游戏无法运行，通常是由于包不兼容、缺少依赖项或 Wine/Proton 未实现的功能。

Lutris 是一款提供运行器和沙箱的软件，使用Lutris可以帮您在安装游戏时处理相关依赖关系，以避免上述复杂和难以处理的枯燥过程。

## 常见的游戏依赖

如果您决定走 Wine/Proton 路线，为了更深入地了解您打算做什么，有必要关注运行游戏所需的常见依赖项。还需要考虑指令集架构，无论是x86还是x64，最好是两者。

prefix需要填充以下内容才能运行"大多数"Windows 游戏。

### 必不可少的（因为被广泛使用）

本文或本章节的语言、语法或风格需要改进。参考：帮助:风格

原因：此处应使用指向包含包链接（例如 Fonts）的 wiki 文章的链接（在Talk:游戏讨论）

- Microsoft Core Fonts
- Microsoft Visual C++ 2015 (2017 版本使用率最高, 推荐安装) [2005, 2008, 2010, 2012, 2013, 2015, 2017-2018, 2019]
- DirectX 9.0 (11.0 版本使用率最高，推荐安装) [June SDK update 2010] {举几个其中包括的例子：}
  - 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 driver
- ACDSee

## 对系统的要求

仅仅用游戏需要的依赖项填充prefix是不够的。Linux内核本身必须具有它将提供运行游戏所需的调用之替代。如前所述，驱动程序和相关替代库必须要是有效的。

### 显卡驱动程序

- AMD 显卡驱动: 参考 AMDGPU.
- Intel 显卡驱动: 参考 Intel graphics.
- NVIDIA 显卡驱动: 参考 NVIDIA.

### 对系统和替代品的依赖

- Wine
- wine-gecko包
- wine-mono包
- Vulkan
- OpenGL
- Proton 可再发行程序库（可选，但可能有帮助）

这主要是提供信息。 一旦你安装了主要的包，其中一些包就会自行安装。

## 游戏环境

Wine/Proton 并不是玩游戏的唯一途径。在Linux中玩游戏存在不同的环境，并且与Windows上的游戏一样多（或更多）：

- 原生游戏——构建目标为 Linux 平台的游戏，附带 OpenGL 和/或 Vulkan 图形 API 支持。
- 游戏模拟器——运行为其他架构和系统设计的软件所必需的。 一旦 ROM 被输入模拟器，大多数游戏都会开箱即用，而且很少遇到问题。 有关选项，请参阅游戏机模拟器。
- Java——一次编写，随处运行平台。 在 Linux 上运行的流行游戏示例有 Minecraft、Runescape、Wurm Online、Puzzle Pirates。
- 网络——在网络浏览器中运行的游戏。
  - 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——用于专有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]。在 SteamOS 中，默认的数值是 2147483642 (MAX_INT - 5)。

运行以下命令以应用更改（无需重启）：

    # sysctl --system

注意：这可能导致与尝试读取核心转储文件的旧程序不兼容 [4].

## 获取游戏

不能仅仅通过游戏是否能在Linux上运行来判断它们是否是原生游戏；它们可能是用 Wine 或 DOSBox 预打包的。

官方仓库或 AUR 中为 Arch 打包的游戏列表请参见游戏列表。

- Athenaeum — Steam 的自由软件替代品。

  https://gitlab.com/librebob/athenaeum || athenaeum-gitAUR

- Bottles — 使用 wine 和 proton 轻松地在 Linux 上运行 Windows 软件。

  https://usebottles.com/ || bottlesAUR,bottles-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 和 Epic 的GUI，Epic Games Launcher 的开源替代品。

  https://heroicgameslauncher.com/ || heroic-games-launcherAUR

- itch.io — 独立游戏商店。

  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 — 一个独一无二的开源启动器；简单一个小软件包，你就可以畅玩喜欢的 mod 并让它们保持更新。

  https://modrinth.com/app || modrinth-app-appimageAUR

- Play.it — 自动构建原生软件包，还支持 Wine、DOSBox 和 ScummVM 游戏。

  https://www.dotslashplay.it/ || play.itAUR

- portproton — 一个用于运行 Windows 游戏和启动器的软件。

  https://linux-gaming.ru/ || portprotonAUR

- Proton — 为 Steam Play 设计的兼容性工具，基于 Wine 和其他附加组分。

  https://github.com/ValveSoftware/Proton || protonAUR[损坏的链接：package not found], proton-experimentalAUR[损坏的链接：package not found]

- proton-ge-custom — GloriousEggroll 修改过的 Proton 编译版本。

  https://github.com/GloriousEggroll/proton-ge-custom || proton-ge-customAUR[损坏的链接：package not found]

- Rare — 基于PyQt5的另一个Epic GUI

  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[损坏的链接：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 # 禁用游戏内空间化
    snd_spatialize_roundrobin 1 # 禁用空间化 1.0*100% 的声音
    dsp_enhance_stereo 0 # 禁用 DSP 音效。 如果你发现它不会干扰您对音效的感知，也可以将其保持打开状态。
    snd_pitchquality 1 # 使用高质量的声音

### 调整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的缓冲相匹配

匹配缓冲区可以减少卡顿并略微提高性能。 有关详细信息，请参考这里。

## 远程游玩

云游戏由于对客户端硬件的要求低，在过去几年中获得了广泛的欢迎。唯一重要的是稳定的互联网连接（推荐使用以太网电缆或 5GHz Wi-Fi），最低速度为 5-10 Mbit/s（取决于视频质量和帧率）。

参考游戏手柄#通过网络使用游戏手柄用于通过网络使用游戏手柄以及通常不支持此功能的服务。

注意：大多数在浏览器中运行的服务通常意味着只与 google-chromeAUR 兼容。

Service | Installer | In browser client | Use your own host | Offers host renting | Full desktop support | Controller support | Remarks
--- | --- | --- | --- | --- | --- | --- | ---
Dixper | – | 是 | Windows-only | ? | ? | ? | –
Reemo | reemod-binAUR | Chromium based only | 是 | 是 | 是 | Windows-only | 您还可以通过他们的网站在下载部分使用官方安装脚本安装软件。
Xbox Cloud | xbox-cloud-gamingAUR | 是 | 否 | 否 | 否 | 是 | 您需要Game Pass Ultimate才能使用XCloud。
GeForce Now | – | 是 | 否 | 否 | 是 | 是 | 您必须在Steam、Epic Client或GOG上有游戏才能使用此服务。并非所有游戏都可用。
Moonlight | moonlight-qtAUR | 否 | 是 | 否 | 是 | 是 | This is only a client. Host machine must use either GeForce Experience (windows only) or Sunshine (multiplatform).
Parsec | parsec-binAUR | 是 (experimental) | Windows-only | 否 | 是 | 是 | –
VDI Stream Client | vdi-stream-clientAUR | 否 | Windows-only | 否 | 是 | 否 | VDI client with 3D GPU acceleration and built-in USB redirection
Playkey | playkey-linuxAUR | ? | ? | ? | ? | ? | –
PlayStation Now[失效链接 2024-07-30 ⓘ] | Runs under Wine or Steam's proton | 否 | 否 | – | 否 | 是 | Play PS4, PS3 and PS2 games on PC. Alternatively, you can use emulators.
PlayStation Remote Play | chiakiAUR | 否 | 是 | – | 是 | 是 | Play games from your PS4 and/or PS5 on PC.
Rainway | 基于浏览器 | 是 | Windows-only | 否 | 是 | ? | –
Shadow | shadow-techAUR | 否 | 否 | 是 | 是 | 是 | 控制器支持依赖于IP上的USB，目前仅支持AVC，不支持HEVC
Steam Remote Play | Part of steam包 | 否 | 是 | 否 | 否 | 是 | –
Vortex[失效链接 2024-01-29 ⓘ] | – | 是 | 否 | – | 否 | ? | –
VNC | tigervnc包 or x11vnc包 | 否 | 是 | 否 | 是 | 否 | General purpose remote desktop protocol, but the latency should be low enough to use it for gaming over a LAN. See Gamepad#Gamepad over network for gamepad support.
xrdp | xrdpAUR | 否 | 是 | 否 | 是 | 否 | Another general purpose remote desktop protocol, has both OpenGL and Vulkan support after configuring graphical accleration. Recommended for gaming over a LAN. See Gamepad#Gamepad over network for gamepad support.
X11 forwarding | openssh包 | 否 | 是 | 否 | 否 | 否 | X forwarding over SSH with VirtualGL supports OpenGL and works for some but not all games. See Gamepad#Gamepad over network for gamepad support.
Boosteroid | boosteroidAUR | 是 | 否 | 否 | 是 | 是 | 您必须在数字发行平台（Steam、EGS、Origin等）上拥有游戏才能使用此服务。并非所有游戏都可用。您需要注册（免费）才能查看完整的游戏列表。您需要购买订阅，才能在数字发行平台上推出您拥有的游戏。
Blacknut | blacknut-appimageAUR or 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写入其中之一来进行更改。 在使用 [5] 的 Zen 3 系统基准测试中，与 `hpet` 或 `acpi_pm` 相比，`tsc` 的吞吐量高约 50 倍。

警告：在 `tsc` 尚不可靠时强行启用之会导致 Firefox 无征兆地崩溃，因为这破坏了为 Firefox 所依赖的 `clock_gettime(CLOCK_MONOTONIC)` 的单一性[6]。使用风险自负！

### 调整内核参数以实现响应时间一致性

您可以安装实时内核以获得一些默认情况下的优势（参见实时内核），代价是损失 CPU 吞吐量且可能延迟中断处理。此外，实时内核与 nvidia-open-dkms包不兼容，并且不会更改 SCHED_NORMAL（也称为 SCHED_OTHER）进程的调度程序，这是默认进程调度类型。以下内核参数更改进一步提高了实时内核以及其他内核（例如默认 linux 内核）的响应时间一致性：

透明巨面（THP）分配的主动压缩会减少平均分配停滞，但不一定减少最大分配停滞。根据内核文档，禁用主动压缩，因为它会引入抖动：

    # echo 0 > /proc/sys/vm/compaction_proactiveness

在内存碎片化的情况下，降低水印加速因数以对一个单独的页面块（64位x86上为2MB）进行碎片整理。这会更好地在内存碎片事件之后将应用程序数据保留在最后一级处理器缓存中。

    # echo 1 > /proc/sys/vm/watermark_boost_factor

如果您有足够的可用 RAM，请增加最小可用千字节数以避免内存分配卡顿：-os-jitter.html[7]。 不要将其设置为低于 1024 KB 或高于系统内存的 5%。 设置为预留1GB的命令如下：

    # echo 1048576 > /proc/sys/vm/min_free_kbytes

如果您有足够的可用 RAM，请增加水印比例因数以进一步降低分配停滞的可能性[8][9]。将水印距离设置为 RAM 的5%：

    # echo 500 > /proc/sys/vm/watermark_scale_factor

除非系统没有更多可用内存，否则避免交换（锁定页面会引入延迟并使用磁盘 IO）：

    # echo 10 > /proc/sys/vm/swappiness

本文或本章节的事实准确性存在争议。

原因： zswap 默认就是被有意地关闭 [10] 以防止卡顿的。（在 Talk:游戏 中讨论）

启用 zswap。如果出现对交换页面的需求, 那么 zswap 会帮助减少交换引起的卡顿。如果没有交换分区，可以使用 zram#Usage as swap 代替 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/khugepaged/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/latency_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

重启后查看值是否生效。

### 减少缓存膨胀 (Buffet Bloat)

设备会在大型缓存排队请求时经受缓存膨胀，导致新请求被长时间阻止。这会在发送和接收数据的时候发生。

缓存膨胀问题可以通过采用智能排队算法来解决，该算法为设备提供公平及时的共享。智能排队算法可以产生更快、更一致的响应时间，但会增加 CPU 开销。对于交互式工作负载，这样减少缓存膨胀是很值得的。

#### 在存储设备上减少缓存膨胀

对于存储设备，BFQ 调度器在最小化缓存膨胀和提高交互性方面最为有效性能优化#调度算法。

#### 在网络上减少缓存膨胀

你可以使用默认的 fq_codel 或者优化过的 cake 智能队列管理算法。它们可以通过 sysctl 设置。

你的家庭路由器可能会导致缓存膨胀，这可以通过重新配置、安装新的路由器操作系统或更换路由器来缓解 (more info)。

[22] 这是检测网络缓存膨胀的一些简易方法。

### 降低 PCI-E 延迟 (PCI Express Latencies)

可以把 PCI-E 延迟修改至与 CachyOS [23] 相似。也可以试着减少一个 PCI-E 客户端（除了声卡）在总线中最多可占用的线路 [24]。注意这些设置与专业音频#系统配置相矛盾。

    # 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 缓存和转换旁视缓冲器（TLB）片段。主线程的吞吐量会随着姐妹线程的行为而改变。SMT 也会降低进程调度器的公平性，即使它知晓 SMT 的存在。

如果你要禁用 SMT，请在 BIOS/UEFI 调整，以获得更好的单核性能。

### 立即加载共享对象以获得更好的首次延迟

给你要运行的游戏设置环境变量

    LD_BIND_NOW=1

避免需要在运行时加载程序代码（参见 ld.so(8)），从而导致第一次调用函数时出现延迟。但是不要为 startplasma-x11 或链接到库中的其他程序设置此项，这些库实际上不再存在于系统中并且永远不会被程序调用。如果是这种情况，程序将在启动时尝试链接一个不存在的共享对象而失败，从而使这个问题很容易识别。启用此设置后，大多数游戏应该都能正常启动。

### 工具

#### GameMode

GameMode 是 Linux 的守护进程和库组合，它允许游戏请求将一组优化临时应用于host操作系统。 这可以提高游戏性能。

#### Gamescope

Gamescope是 Valve 开发的一个微合成器，用于 Steam Deck 。其目标是提供一种针对游戏量身定制的独立合成器，并且支持许多以游戏为中心的功能。

### ACO编译器

注意：下面显示的方法仅适用于运行AMDGPU 驱动程序的 AMD GPU。

参考 AMDGPU#ACO编译器

### 减少DRI延迟

直接渲染基础结构 (DRI) 配置文件适用于所有DRI驱动程序，包括Mesa和Nouveau。您可以在 `/etc/drirc` 或每个用户在 `$HOME/.drirc` 中更改系统范围内的 DRI 配置。如果文件不存在，可以创建它们。两个文件使用相同的语法； 这些选项的文档可以在 [25] 找到。如果要禁用垂直同步来减少输入延迟，添加以下内容：

    <driconf>
       <device>
           <application name="Default">
               <option name="vblank_mode" value="0" />
           </application>
       </device>
    </driconf>

### 使用调度策略提高帧速率和响应能力

Most games can benefit if given the correct scheduling policies for the kernel to prioritize the task. These policies should ideally be set per-thread by the application itself.

For programs which do not implement scheduling policies on their own, application known as schedtool包, and its associated daemon schedtooldAUR can handle many of these tasks automatically.

To edit what programs relieve what policies, simply edit `/etc/schedtoold.conf` and add the program followed by the schedtool arguments desired.

#### Policies

`SCHED_ISO` (only implemented in BFS/MuQSSPDS schedulers found in -pf and -ck kernels) – will not only allow the process to use a maximum of 80 percent of the CPU, but will attempt to reduce latency and stuttering wherever possible. Most if not all games will benefit from this:

    bit.trip.runner -I

`SCHED_FIFO` provides an alternative, that can even work better. You should test to see if your applications run more smoothly with `SCHED_FIFO`, in which case by all means use it instead. Be warned though, as `SCHED_FIFO` runs the risk of starving the system! Use this in cases where -I is used below:

    bit.trip.runner -F -p 15

#### Nice levels

Secondly, the nice level sets which tasks are processed first, in ascending order. A nice level of -4 is recommended for most multimedia tasks, including games:

    bit.trip.runner -n -4

#### Core affinity

There is some confusion in development as to whether the driver should be multithreading, or the program. Allowing both the driver and program to simultaneously multithread can result in significant performance reductions, such as framerate loss and increased risk of crashes. Examples of this include a number of modern games, and any Wine program which is running with GLSL enabled. To select a single core and allow only the driver to handle this process, simply use the `-a 0x#` flag, where # is the core number, e.g.:

    bit.trip.runner -a 0x1

uses first core.

Some CPUs are hyperthreaded and have only 2 or 4 cores but show up as 4 or 8, and are best accounted for:

    bit.trip.runner -a 0x5

which use virtual cores 0101, or 1 and 3.

#### General case

For most games which require high framerates and low latency, usage of all of these flags seems to work best. Affinity should be checked per-program, however, as most native games can understand the correct usage. For a general case:

    bit.trip.runner -I -n -4
    Amnesia.bin64 -I -n -4
    hl2.exe -I -n -4 -a 0x1 #Wine with GLSL enabled

etc.

#### Optimus, and other helping programs

As a general rule, any other process which the game requires to operate should be reniced to a level above that of the game itself. Strangely, Wine has a problem known as reverse scheduling, it can often have benefits when the more important processes are set to a higher nice level. Wineserver also seems unconditionally to benefit from `SCHED_FIFO`, since it rarely consumes the whole CPU and needs higher prioritization when possible.

    optirun -I -n -5
    wineserver -F -p 20 -n 19
    steam.exe -I -n -5

## Peripherals

### Mouse

You might want to set your mouse acceleration to control your mouse more accurately.

If your mouse has more than 3 buttons, you might want to see Mouse buttons.

If you are using a gaming mouse (especially Logitech and Steelseries) you may want to configure your mouse polling rate, DPI, LEDs etc. Using piper包. See this page for a full list of supported devices by piper. Alternatively solaar包 for logitech devices only.

### LEDs

You can change and manipulate various RGBs with openrgb包, for a list of currently supported devices see [26].

## See also

- [27] - Forum on reddit.com with gaming on linux as its topic, subpages: Wiki, FAQ.
- Linux Gaming Guide - Compilation of different techniques for optimizing the Linux gaming experience.
- are we anti cheat yet A comprehensive and crowd-sourced list of games using anti-cheats and their compatibility with GNU/Linux or Wine/Proton.
- proton db crowdsourced Linux compatibility reports

分类：​

- 游戏
- 使用“模板:风格”标记的页面或章节
- 包含损坏的软件包链接的页面
- 包含失效链接的页面

隐藏分类：​

- 使用“模板:Translateme”标记的页面或章节
- 使用“模板:准确性”标记的页面或章节

游戏
添加话题