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 文件,以及每个子模块和目录中的 LICENSE、COPYING 等文件
以获取详细信息。如果您向其他用户分发已构建的 Proton 版本,您必须遵守这些
许可证的条款。
调试
Proton 构建默认会剥离其符号。您可以在 Steam 中切换到 "debug" 测试分支(在您的库中搜索 Proton, 属性... -> 测试版 -> 选择 "debug")或在不剥离的情况下构建(参见 Debug Builds 部分)。
符号通过随附的 .debug 文件提供,这些文件
可能需要由调试工具显式加载。对于 GDB,有一个辅助
脚本 wine/tools/gdbinit.py(source 它),它提供 load-symbol-files
(或简写为 lsf)命令,用于加载所有已映射文件的符号。
有关调试技巧,请参阅 docs/DEBUGGING-LINUX.md 和 docs/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 中使用该文件:
- directly - some editors/plugins allow you to specify the path to
compile_commands.json - via
.clangdfile, e.g.
cd src/proton/wine/
cat > .clangd <<EOF
CompileFlags:
CompilationDatabase: ../build/current-dev/compile_commands/wine-x86_64/
EOF
- by symlinking:
ln -s ../build/current-dev/compile_commands/wine-x86_64/compile_commands.json .
运行时配置选项
Proton 可以在运行时进行调优,以帮助某些游戏运行。Steam 客户端使用 STEAM_COMPAT_CONFIG 变量为已知游戏设置
一些选项。
你可以使用下面描述的环境变量来覆盖这些选项。
为所有游戏设置这些环境变量覆盖的最佳方法是重命名
user_settings.sample.py 为 user_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 | 将崩溃日志写入此目录。不会清理旧日志,因此最终可能会耗尽所有磁盘空间。 | |
wined3d | PROTON_USE_WINED3D | 对于 d3d11、d3d10 和 d3d9,使用基于 OpenGL 的 wined3d 而不是基于 Vulkan 的 DXVK。 |
nod3d11 | PROTON_NO_D3D11 | 禁用 d3d11.dll,适用于可以回退到 d3d9 并运行得更好的 d3d11 游戏。 |
nod3d10 | PROTON_NO_D3D10 | 禁用 d3d10.dll 和 dxgi.dll,适用于可以回退到 d3d9 并运行得更好的 d3d10 游戏。 |
dxvkd3d8 | PROTON_DXVK_D3D8 | 使用 DXVK 的 d3d8.dll。 |
nofsync | PROTON_NO_FSYNC | 不使用基于 futex 的进程内同步原语。(在没有 FUTEX_WAIT_MULTIPLE 支持的系统上会自动禁用。) |
PROTON_NO_NTSYNC | 不要使用 ntsync。 | |
HOST_LC_ALL | 将值设置为某个区域设置,以覆盖游戏的所有其他系统区域设置。 应使用此变量代替 LC_ALL。 | |
disablenvapi | PROTON_DISABLE_NVAPI | 禁用 NVIDIA 的 NVAPI GPU 支持库。 |
nativevulkanloader | 使用随游戏附带的 Vulkan 加载器,而不是 Proton 内置的 Vulkan 加载器。这会破坏 VR 支持,但某些游戏需要这样做。 | |
forcelgadd | PROTON_FORCE_LARGE_ADDRESS_AWARE | 强制 Wine 为所有可执行文件启用 LARGE_ADDRESS_AWARE 标志。默认已启用。 |
heapdelayfree | PROTON_HEAP_DELAY_FREE | 延迟释放某些内存,以解决应用程序的释放后使用(use-after-free)错误。 |
gamedrive | PROTON_SET_GAME_DRIVE | 创建一个指向包含该游戏的 Steam 库的 S: 驱动器。 |
noforcelgadd | 禁用 forcelgadd。如果同时设置了此项和 forcelgadd,则启用项优先。 | |
oldglstr | PROTON_OLD_GL_STRING | 设置一些驱动程序覆盖项,以限制 GL 扩展字符串的长度,用于在非常长的扩展字符串上崩溃的旧游戏。 |
vkd3dfl12 | 无论驱动程序是否支持,都将 Direct3D 12 功能级别强制设置为 12。 | |
vkd3dbindlesstb | 将 force_bindless_texel_buffer 放入 VKD3D_CONFIG。 | |
nomfdxgiman | WINE_DO_NOT_CREATE_DXGI_DEVICE_MANAGER | 启用 hack 以解决某些游戏中因 IMFDXGIDeviceManager 支持不完整导致的视频问题。 |
noopwr | WINE_DISABLE_VULKAN_OPWR | 启用 hack 以禁用 Vulkan 其他进程窗口渲染,这在 Wayland 上有时会导致问题,因为 blit 会滞后一帧。 |
hidenvgpu | PROTON_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 noxalia | PROTON_USE_XALIA | 启用 Xalia,这是一个可以为某些键盘/鼠标界面添加游戏手柄 UI 的程序,或设置为 0 以禁用。默认情况下,它会根据窗口内容动态启用。 |
fnad3d11 | FNA3D_FORCE_DRIVER=D3D11 | 强制 FNA 使用 D3D11 进行渲染。 |
seccomp | PROTON_USE_SECCOMP | 注意:在 Proton 5.13 中已废弃。 在旧版本中,启用 seccomp-bpf 过滤器以模拟原生系统调用,某些 DRM 保护机制需要此功能才能正常工作。 |
d9vk | PROTON_USE_D9VK | 注意:在 Proton 5.0 中已废弃。 在旧版本中,对于 d3d9,使用基于 Vulkan 的 DXVK 而非基于 OpenGL 的 wined3d。 |
noesync | PROTON_NO_ESYNC | 注意:在 Proton 11.0 中已废弃。 在旧版本中,不使用基于 eventfd 的进程内同步原语。 |