ITADN
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

Introduction

Proton 是一款用于 Steam 客户端的工具,它允许仅在 Windows 上独占运行的游戏在 Linux 操作系统上运行。它使用 Wine 来实现这一功能。

大多数用户应使用 Steam 客户端本身提供的 Proton。 有关更多详细信息,请参阅 这篇 Steam 社区帖子

提供源代码是为了让高级用户能够修改 Proton。例如,某些用户可能希望针对特定游戏使用不同版本的 Wine 。

更新日志 可在 我们的 wiki 上查看。

获取 Proton 源代码

通过克隆 https://github.com/ValveSoftware/Proton 并检出您所需的分支来获取 Proton 的源代码。

您可以使用以下命令将最新的 Proton 克隆到您的系统中:

git clone --recurse-submodules https://github.com/ValveSoftware/Proton.git proton

在分支之间切换时,请务必更新子模块:

git checkout experimental_6.3
git submodule update --init --recursive

如果你想更改任何子组件,现在是时候这样做了。例如,如果你希望对 Wine 进行修改,你会将它们应用到 wine/ 目录中。

构建 Proton

Proton 的大部分构建都在 Proton SDK 容器内进行,对主机端的依赖非常少。

准备构建环境

你需要一个 Docker 或 Podman 环境,Proton 的构建系统会在内部使用它。除非你直接处理构建系统的这些部分,否则你绝不需要手动使用任何容器引擎。

我们强烈推荐使用 无 root 权限的 Podman 设置。请参阅你的发行版的文档以获取设置说明(例如 Arch Podman / Docker,Debian Podman / Docker)。

简易方法

我们提供了一个顶层 Makefile,它将为你执行大部分构建命令。

在检出仓库并更新其子模块后,假设你拥有可用的 Docker 或 Podman 环境,你可以通过以下简单命令构建并安装 Proton:

make install

如果你的构建系统缺少依赖项,它将快速失败并显示清晰的 错误信息。

构建完成后,你可能需要重启 Steam 客户端才能看到 新的 Proton 工具。该工具在 Steam 客户端中的名称将基于 当前检出的 Proton 分支。你可以使用 build_name 变量来覆盖此名称。

有关其他构建目标和选项,请参阅 make help

手动构建

配置构建

mkdir ../build && cd ../build
../proton/configure.sh --enable-ccache --build-name=my_build

运行 configure.sh 将创建一个 Makefile,允许你构建 Proton。 该脚本会检查容器是否可用,并在缺少任何 主机端依赖项时提示你。你应该从一个 专门为你的构建创建的目录中运行该命令。

配置脚本会尝试发现可用的 Docker 或 Podman 设置 以供使用,但你可以通过 --container-engine=<executable_name> 强制使用兼容的引擎。

你可以使用 --enable-cache 标志启用 ccache。这将在容器内挂载你的 $CCACHE_DIR$HOME/.ccache

--proton-sdk-image=registry.gitlab.steamos.cloud/proton/soldier/sdk:<version> 可用于使用自定义版本的 Proton SDK 镜像进行构建。

查看 --help 了解其他配置选项。

注意:如果正在使用 SELinux,Proton 构建容器可能无法访问 你的用户文件。这是由 SELinux 的文件系统 标签 引起的。你可以向 configure 传递 --relabel-volumes 开关,以 让容器引擎重新标记其 绑定挂载,并允许从容器内部 访问这些文件。在与系统目录一起使用时,这可能很危险。请 谨慎操作,并参阅你的容器引擎手册。

构建

make

重要的 make 目标:

make install - 将 Proton 安装到用户的 Steam 目录中,详情请参阅 在本地安装 Proton 部分。

make redist - 创建一个可再分发构建(redist/),该构建可被复制到 ~/.steam/root/compatibilitytools.d/

make deploy - 创建一个部署构建(deploy/)。这是我们通过 Steamworks 向 Steam 用户部署 Proton 所使用的构建。

make module=<module> module - 构建指定 wine 模块的 32 位和 64 位版本。这允许对单个模块进行快速迭代。此目标仅在构建 Proton 之后才有用。

make dxvk / make vkd3d-proton - 重新构建 DXVK / vkd3d-proton。

查明构建失败的原因

Proton 构建系统会并行调用许多子项目的构建。如果某个 子项目失败,在顶层退出之前,其他子构建可能会打印出数千行内容。 这使得很难找到构建失败的真实原因。

在末尾添加 2>&1 | tee build.log 会将完整的构建输出记录到一个 build.log 文件中。从该文件的底部向上搜索 Error 的出现位置,应该 能指向正确的区域。例如:

make 2>&1 | tee build.log
grep -n '] Error [0-9]' build.log
11220:make: *** [../Makefile.in:465: /builds/proton/proton/build-dir/.kaldi-i386-configure] Error 1
12427:make: *** [../Makefile.in:1323: deploy] Error 2

调试构建

为防止符号剥离,请在 make 调用中添加 UNSTRIPPED_BUILD=1。此操作仅应在干净的构建目录中使用。

E.g.:

mkdir ../debug-proton-build && cd ../debug-proton-build
../proton/configure.sh --enable-ccache --build-name=debug_build
make UNSTRIPPED_BUILD=1 install

ARM64 构建

你需要一台 ARM64 构建机器,并将 --target-arch=arm64 传递给 configure.sh

无法在通过 FEX 运行的 x86 Steam 中使用由此生成的构建版本。

在本地安装 Proton

Steam 附带了多个版本的 Proton,游戏默认会使用这些版本,或者你可以在 Steam 设置的 Steam Play 页面中进行选择。Steam 还支持使用 Proton 的本地构建版本来运行游戏,你可以将其安装到你的机器上。

要将 Proton 的本地构建版本安装到 Steam 中,请在 ~/.steam/root/compatibilitytools.d/ 中创建一个新目录,使用你选择的工具名称,并将包含可再分发构建的目录放置在该路径下。

make install 目标将为你执行此任务,将 Proton 构建版本安装到当前用户的 Steam 文件夹中。你必须重启 Steam 客户端,它才能识别新的工具。

正确的本地工具安装应类似于以下内容:

compatibilitytools.d/my_proton/
├── compatibilitytool.vdf
├── filelock.py
├── LICENSE
├── proton
├── proton_dist.tar
├── toolmanifest.vdf
├── user_settings.sample.py
└── version

要在 Steam 中启用本地构建,请前往设置窗口的 Steam Play 部分。如果构建已正确安装,您应该在兼容性工具的下拉列表中看到 "proton-localbuild"。

本软件的每个组件均在其许可证条款下使用。 请参阅此处的 LICENSE 文件,以及每个子模块和目录中的 LICENSECOPYING 等文件 以获取详细信息。如果您向其他用户分发已构建的 Proton 版本,您必须遵守这些 许可证的条款。

调试

Proton 构建默认会剥离其符号。您可以在 Steam 中切换到 "debug" 测试分支(在您的库中搜索 Proton, 属性... -> 测试版 -> 选择 "debug")或在不剥离的情况下构建(参见 Debug Builds 部分)。

符号通过随附的 .debug 文件提供,这些文件 可能需要由调试工具显式加载。对于 GDB,有一个辅助 脚本 wine/tools/gdbinit.py(source 它),它提供 load-symbol-files (或简写为 lsf)命令,用于加载所有已映射文件的符号。

有关调试技巧,请参阅 docs/DEBUGGING-LINUX.mddocs/DEBUGGING-WINDOWS.md

compile_commands.json

用于配合 clangd LSP 服务器及类似工具使用。

使用 cmake 或 meson 构建的项目(例如 vkd3d-proton)会自动附带 compile_commands.json。Wine 也会通过 makedep 自行生成该文件。

Proton 的构建系统会收集构建子目录 compile_commands/ 中的所有 compile_commands.json 文件。

路径会被转换以指向真实的源代码(即非 rsync 的 副本)。不过,对于诸如自动生成的 config.h 之类的内容,它可能仍然依赖于构建目录,而对于 wine,在您的源目录中运行 tools/make_requests 可能更有益,因为这些更改未被提交。

然后,您可以通过以下几种方式配置编辑器,使其在 clangd 中使用该文件:

  1. directly - some editors/plugins allow you to specify the path to compile_commands.json
  2. via .clangd file, e.g.
cd src/proton/wine/
cat > .clangd <<EOF
CompileFlags:
  CompilationDatabase: ../build/current-dev/compile_commands/wine-x86_64/
EOF
  1. by symlinking:
ln -s ../build/current-dev/compile_commands/wine-x86_64/compile_commands.json .

运行时配置选项

Proton 可以在运行时进行调优,以帮助某些游戏运行。Steam 客户端使用 STEAM_COMPAT_CONFIG 变量为已知游戏设置 一些选项。 你可以使用下面描述的环境变量来覆盖这些选项。

为所有游戏设置这些环境变量覆盖的最佳方法是重命名 user_settings.sample.pyuser_settings.py 并对其进行相应修改。 该文件位于 Steam 库中的 Proton 安装目录中 (通常为 ~/.steam/steam/steamapps/common/Proton #.#)。

如果您想更改特定游戏的运行时配置,您可以 使用 Steam 客户端中游戏 Properties 对话框中的 Set Launch Options 设置。设置变量,后跟 %command%。例如,输入 "PROTON_USE_WINED3D=1 %command%" 以使用基于 OpenGL 的 wined3d 渲染器 代替基于 Vulkan 的 DXVK 渲染器。

要启用某个选项,请将变量设置为非 0 值。 要禁用某个 选项,请将变量设置为 0。要使用 Steam 的默认配置,请 完全不要指定该变量。

以下所有均为运行时选项。它们不会对 Wine 前缀产生永久性更改。移除该选项将恢复为之前的行为。

兼容配置字符串环境变量描述
PROTON_LOG一种便捷方法,用于将有用的调试日志转储到 $PROTON_LOG_DIR/steam-$APPID.log。设置为 1 以启用默认日志记录,或设置为字符串以追加到默认的 WINEDEBUG 通道。
PROTON_LOG_DIR将日志文件输出到指定目录。默认值为用户主目录。
PROTON_WAIT_ATTACH在启动游戏进程之前,等待调试器附加到 steam.exe。要在启动时附加到游戏进程,调试器应设置为跟踪子进程。
PROTON_CRASH_REPORT_DIR将崩溃日志写入此目录。不会清理旧日志,因此最终可能会耗尽所有磁盘空间。
wined3dPROTON_USE_WINED3D对于 d3d11、d3d10 和 d3d9,使用基于 OpenGL 的 wined3d 而不是基于 Vulkan 的 DXVK。
nod3d11PROTON_NO_D3D11禁用 d3d11.dll,适用于可以回退到 d3d9 并运行得更好的 d3d11 游戏。
nod3d10PROTON_NO_D3D10禁用 d3d10.dlldxgi.dll,适用于可以回退到 d3d9 并运行得更好的 d3d10 游戏。
dxvkd3d8PROTON_DXVK_D3D8使用 DXVK 的 d3d8.dll
nofsyncPROTON_NO_FSYNC不使用基于 futex 的进程内同步原语。(在没有 FUTEX_WAIT_MULTIPLE 支持的系统上会自动禁用。)
PROTON_NO_NTSYNC不要使用 ntsync。
HOST_LC_ALL将值设置为某个区域设置,以覆盖游戏的所有其他系统区域设置。 应使用此变量代替 LC_ALL
disablenvapiPROTON_DISABLE_NVAPI禁用 NVIDIA 的 NVAPI GPU 支持库。
nativevulkanloader使用随游戏附带的 Vulkan 加载器,而不是 Proton 内置的 Vulkan 加载器。这会破坏 VR 支持,但某些游戏需要这样做。
forcelgaddPROTON_FORCE_LARGE_ADDRESS_AWARE强制 Wine 为所有可执行文件启用 LARGE_ADDRESS_AWARE 标志。默认已启用。
heapdelayfreePROTON_HEAP_DELAY_FREE延迟释放某些内存,以解决应用程序的释放后使用(use-after-free)错误。
gamedrivePROTON_SET_GAME_DRIVE创建一个指向包含该游戏的 Steam 库的 S: 驱动器。
noforcelgadd禁用 forcelgadd。如果同时设置了此项和 forcelgadd,则启用项优先。
oldglstrPROTON_OLD_GL_STRING设置一些驱动程序覆盖项,以限制 GL 扩展字符串的长度,用于在非常长的扩展字符串上崩溃的旧游戏。
vkd3dfl12无论驱动程序是否支持,都将 Direct3D 12 功能级别强制设置为 12。
vkd3dbindlesstbforce_bindless_texel_buffer 放入 VKD3D_CONFIG
nomfdxgimanWINE_DO_NOT_CREATE_DXGI_DEVICE_MANAGER启用 hack 以解决某些游戏中因 IMFDXGIDeviceManager 支持不完整导致的视频问题。
noopwrWINE_DISABLE_VULKAN_OPWR启用 hack 以禁用 Vulkan 其他进程窗口渲染,这在 Wayland 上有时会导致问题,因为 blit 会滞后一帧。
hidenvgpuPROTON_HIDE_NVIDIA_GPU强制 Nvidia GPU 始终报告为 AMD GPU。如果某些游戏依赖于仅限 Windows 的 Nvidia 驱动程序功能,则需要此设置。另请参阅 DXVK 的 nvapiHack 配置,该配置仅影响来自 Direct3D 的报告。
WINE_FULLSCREEN_INTEGER_SCALING启用整数缩放模式,以便在放大时获得清晰的像素。
WINE_USE_KWIN_HACKS启用 KDE 特定的窗口 hack,可能会改善 Wayland 上早于 6.4 的 KDE 和 X11 上早于 6.6 的 KDE 的体验。
cmdlineappend:将冒号后的字符串作为参数附加到游戏命令中。可以多次指定。使用反斜杠转义逗号和反斜杠。
xalia or noxaliaPROTON_USE_XALIA启用 Xalia,这是一个可以为某些键盘/鼠标界面添加游戏手柄 UI 的程序,或设置为 0 以禁用。默认情况下,它会根据窗口内容动态启用。
fnad3d11FNA3D_FORCE_DRIVER=D3D11强制 FNA 使用 D3D11 进行渲染。
seccompPROTON_USE_SECCOMP注意:在 Proton 5.13 中已废弃。 在旧版本中,启用 seccomp-bpf 过滤器以模拟原生系统调用,某些 DRM 保护机制需要此功能才能正常工作。
d9vkPROTON_USE_D9VK注意:在 Proton 5.0 中已废弃。 在旧版本中,对于 d3d9,使用基于 Vulkan 的 DXVK 而非基于 OpenGL 的 wined3d。
noesyncPROTON_NO_ESYNC注意:在 Proton 11.0 中已废弃。 在旧版本中,不使用基于 eventfd 的进程内同步原语。