Proton - 声明性、类型安全的 Web 端点库

Created at: 2018-03-14 02:45:27
Language: C++
License: NOASSERTION

介绍

Proton是一种与Steam客户端一起使用的工具,它允许Windows独有的游戏在Linux操作系统上运行。它使用Wine来促进这一点。

大多数用户应该使用Steam客户端本身提供的Proton。请参阅此 Steam 社区帖子,了解更多详情。

提供源代码是为了使高级用户能够更改Proton。例如,一些用户可能希望使用具有不同版本的Wine和特定标题。

更改日志可在我们的维基上找到。

获取质子源

通过克隆 https://github.com/ValveSoftware/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 SDK容器内,主机端的依赖性很少。

准备构建环境

你需要一个 Docker 或 Podman 设置。我们强烈推荐无根 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

配置脚本会尝试发现要使用的工作 Docker 或 Podman 设置,但你可以使用 强制使用 兼容的引擎。

--container-engine=<executable_name>

你可以启用带有标志的ccache。这将安装在容器内或容器内。

--enable-cache
$CCACHE_DIR
$HOME/.ccache

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

检查其他配置选项。

--help

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

--relabel-volumes

建筑

make

重要制作目标:

make install
- 将 Proton 安装到用户的 Steam 目录中,有关详细信息,请参阅 Proton 本地安装部分。

make redist
- 创建可复制到 的重新分发版本 ()。
redist/
~/.steam/root/compatibilitytools.d/

make deploy
- 创建部署版本 ()。这就是我们通过Steamworks将Proton部署到Steam用户的方法。
deploy/

make module=<module> module
- 构建指定 Wine 模块的 32 位和 64 位版本。这允许在一个模块上快速迭代。这个目标只有在构建质子后才有用。

make dxvk
/
make vkd3d-proton
- 重建DXVK / vkd3d质子。

调试版本

为了防止符号剥离,请添加到调用中。这应仅与干净的生成目录一起使用。

UNSTRIPPED_BUILD=1
make

例如:

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

在本地安装质子

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

要将 Proton 的本地版本安装到 Steam 中,请使用你选择的工具名称创建一个新目录,并将包含可再发行版本的目录放在该路径下。

~/.steam/root/compatibilitytools.d/

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

make install

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

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”。

该软件的每个组件均根据其许可条款使用。有关详细信息,请参阅此处的文件,以及每个子模块和目录中的 、 等 文件。如果你将 Proton 的构建版本分发给其他用户,则必须遵守这些许可证的条款。

LICENSE
LICENSE
COPYING

调试

默认情况下,质子构建的符号被剥离。你可以在Steam中切换到“调试”beta分支(在库中搜索Proton,属性... ->BETAS ->选择“调试”)或不剥离构建(请参阅调试版本部分)。

这些符号通过随附的文件提供,这些文件可能需要由调试工具显式加载。对于GDB,有一个帮助程序脚本(source it),它提供(或简称)命令,用于加载所有映射文件的符号。

.debug
wine/tools/gdbinit.py
load-symbol-files
lsf

运行时配置选项

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

STEAM_COMPAT_CONFIG

为所有游戏设置这些环境覆盖的最佳方法是重命名为 并对其进行适当的修改。此文件位于 Steam 库的 Proton 安装目录中(通常)。

user_settings.sample.py
user_settings.py
~/.steam/steam/steamapps/common/Proton #.#

如果要更改特定游戏的运行时配置,可以使用 Steam 客户端中游戏对话框中的设置。设置变量,后跟 。例如,输入 “” 以使用基于 OpenGL 的 wined3d 渲染器,而不是基于 Vulkan 的 DXVK 渲染器。

Set Launch Options
Properties
%command%
PROTON_USE_WINED3D=1 %command%

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

0
0

以下所有内容都是运行时选项。它们不会影响对 Wine 前缀的永久更改。删除该选项将恢复到以前的行为。

兼容配置字符串 环境变量 描述
PROTON_LOG
将有用的调试日志转储到 的方便方法。设置为 启用默认日志记录,或设置为要追加到默认通道的字符串。
$PROTON_LOG_DIR/steam-$APPID.log
1
WINEDEBUG
PROTON_LOG_DIR
将日志文件输出到指定的目录中。默认为主目录。
PROTON_DUMP_DEBUG_COMMANDS
运行游戏时,Proton会将该游戏的一些有用的调试脚本写入 .
$PROTON_DEBUG_DIR/proton_$USER/
PROTON_DEBUG_DIR
默认情况下,质子调试脚本的根目录。
/tmp
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 游戏,这些游戏可以回退到 d3d9 并运行得更好。
d3d11.dll
nod3d10
PROTON_NO_D3D10
禁用 和 ,用于 d3d10 游戏,这些游戏可以回退到 d3d9 并运行得更好。
d3d10.dll
dxgi.dll
noesync
PROTON_NO_ESYNC
不要使用基于事件 fd 的进程内同步基元。
nofsync
PROTON_NO_FSYNC
不要使用基于 futex 的进程内同步原语。(在不受支持的系统上自动禁用。
FUTEX_WAIT_MULTIPLE
noxim
PROTON_NO_XIM
默认情况下启用。不要尝试使用 XIM(X 输入法)支持。已知 XIM 支持会导致 libx11 低于版本 1.7 的崩溃。
enablenvapi
PROTON_ENABLE_NVAPI
启用 NVIDIA 的 NVAPI GPU 支持库。
nativevulkanloader
使用游戏附带的Vulkan加载器,而不是Proton的内置Vulkan加载器。这破坏了VR支持,但一些游戏需要这样做。
forcelgadd
PROTON_FORCE_LARGE_ADDRESS_AWARE
强制 Wine 为所有可执行文件启用 LARGE_ADDRESS_AWARE 标志。默认情况下启用。
heapdelayfree
PROTON_HEAP_DELAY_FREE
延迟释放一些内存,以解决应用程序释放后使用的错误。
gamedrive
PROTON_SET_GAME_DRIVE
创建一个指向包含游戏的 Steam 库的 S: 驱动器。
noforcelgadd
禁用强制加德。如果同时设置了此值和,则启用此选项优先。
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
启用黑客以解决由于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
启用整数缩放模式,以便在升级时提供清晰的像素。
cmdlineappend:
将字符串追加在冒号之后,作为游戏命令的参数。可以多次指定。使用反斜杠对逗号和反斜杠进行转义。
nowritewatch
PROTON_NO_WRITE_WATCH
在 ntdll 中禁用对内存写入监视的支持。这是一个非常危险的黑客攻击,只有在你验证游戏可以在没有写入监视的情况下运行时才应应用。这提高了一些非常具体的游戏(例如,基于CoreRT的游戏)的性能。
nosteamffmpeg
PROTON_NO_STEAM_FFMPEG
忽略随 Steam 一起提供的 ffmpeg。某些视频可能无法播放。
seccomp
PROTON_USE_SECCOMP
注意:在质子 5.13 中已过时。在旧版本中,启用 seccomp-bpf 筛选器以模拟某些 DRM 保护正常工作所需的本机系统调用。
d9vk
PROTON_USE_D9VK
注意:在质子 5.0 中已过时。在旧版本中,使用基于Vulkan的DXVK而不是基于OpenGL的wined3d进行d3d9。