Protonの概要と導入、使い方

Last modified: 2021-06-15

Protonとは

概要

Wineをベースとして、Windows用のゲームを動かすことに特化させる追加のパッチやLinux版Steamとの統合などを組み込んだ派生版Wineで、SteamのValve社と商用WineのCodeWeavers社が協力して開発している。

Direct3Dの9から11は標準でVulkanによる実装のDXVKを使用するが、Steamのゲームごとの “起動オプション” にPROTON_USE_WINED3D=1 %command%を入力して起動するなどして環境変数PROTON_USE_WINED3D1にして実行することでWineのDirect3D実装を使用することもできる。12はWineと同様にVulkanで実装されたvkd3dを用いる。

DXVKがDirect3Dの9から11までのAPIをVulkanで実装している関係で、ある程度古めのゲームのプレイであってもVulkanに対応した世代のGPUの使用を強く推奨する。

Protonの5.13以上のバージョンでは、Linux版Steamは “Steam Linux Runtime (Soldier)” と呼ばれる独自のGNU/Linux環境のコンテナを用いてその中でProtonを実行する。このとき、一部の共有されるディレクトリを除いてLinux OS上のプログラムやデータのファイルにはアクセスできず、ゲームは隔離された環境(サンドボックス内)で動くことになる。

ProtonはSteamで公開されていないゲームに対して使うこともできるが、特定の環境変数が必須だったり、使い方が独自なところがある。

Protonのバージョン系統

Protonにはバージョンの系統があり、バージョンの値自体はベースとなるWineのバージョンに基づいて付けられる。

例として、2020-2021年においては

  • 5.0
  • 5.13
  • 6.3

のようにバージョン系統が分かれており、それぞれが独立したSteam AppId(ゲームやツールを識別するための固有の番号)を持ち、アップデートによって強制的に新しいバージョン系統に移行させられることはない。ただし最新ではなくなった系統はしばらくして更新が止まる。

各バージョン系統はProtonにおけるメジャーリリース番号のようにとらえることもできる。

入手

ソースはGitHubのリポジトリにあり、バイナリは

  • Linux版SteamクライアントからWindows用のゲームを実行する際に自動的にインストールされる
  • Steamクライアントの “ライブラリ” で “ツール” の一覧からバージョンごとの “Proton” の項目を手動で選択してインストールする

のいずれかにより入手する。

バイナリのインストール先は[Steamライブラリ]/steamapps/common/Proton [バージョン]/となる。一旦インストールすると、Steam上のゲームと同様にアップデートが利用可能なときに更新されるようになる。

初期状態のSteamライブラリは、Steamのインストール先のディレクトリとなる。これは

  • Steamのサイトにあるパッケージを入れた場合、環境変数XDG_DATA_HOMEが定義されているかどうかで決まる:
    • 定義時: $XDG_DATA_HOME/Steam/
    • 未定義時: [ホームディレクトリ]/.local/share/Steam/
  • Debian系(Ubuntuやその派生など)でディストリのパッケージからSteamをインストールした場合は以下のいずれかとなる:
    • [ホームディレクトリ]/.steam/debian-installation/
    • [ホームディレクトリ]/.steam/

Linux版SteamCMDを用いたインストール例

Proton 6.3(AppIdは1580130)をコマンドでインストールする例。Protonは匿名ログインでもダウンロードできるため、Steamアカウントがなくてもインストールできる。

+force_install_dirの後ろにはインストール先のディレクトリを指定する。

$ wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
$ tar zxf steamcmd_linux.tar.gz
$ ./steamcmd.sh +login anonymous +force_install_dir ~/proton_6_3 +app_update 1580130 validate +quit

最後のsteamcmd.shを再度実行すると、同一バージョン系統内のアップデートがある場合に適用される。AppIdはProtonのバージョン系統ごとに変わるので、新しい系統がリリースされたらそのAppIdを調べ、それに対してsteamcmd.shを実行する。

SteamクライアントからのProtonのバージョンの選択

Steamクライアントからどのバージョン系統のProtonを使用するかは、ゲームごとの “互換性” の設定でインストール済みの一覧から指定できる。

Steamクライアントからは全てのゲームで同一バージョンを使用するように設定することもできるが、ゲーム単位で個別に設定したほうが不具合が出たときに柔軟に対応できる。

ゲームの開始

SteamのWindows用ゲームに対してはSteamクライアントのゲームの “プレイ” ボタンなどからゲームを開始するだけでよい。初回実行時はゲームによっては必要なランタイムパッケージのインストールが自動で行われ、少し余計に時間がかかる。これはProtonのバージョン系統を切り替えた際にも行われることがある。

DXVK上のDirect3Dを含め、Vulkanを使用しているゲームを開始する際にはVulkanシェーダの処理が発生する場合があり、それなりの時間を要するが、これはゲーム中のフレームレートの安定に役立っているらしい。

コマンドによる手動実行

コマンドを用いて手動でゲームを動かすには、中のprotonコマンドを用いてプログラムを実行するか、Wineと同様に内のwineコマンドを指定して実行する。ここでは前者についてを扱う。

実行には最低限STEAM_COMPAT_DATA_PATHという環境変数が必要で、これはWineの環境変数WINEPREFIXで指定される仮想Windows環境を拡張したProton用の環境の場所を指定する。新しく作るにはこの場所を空のディレクトリにしてプログラムを実行する。

Protonによって作成される環境は[Steamライブラリ]/steamapps/compatdata/[ゲームのAppId]/に保存される。既存の環境を指定するにはこの場所を指定する。

STEAM_COMPAT_DATA_PATHを指定して作られたProton用の環境にはpfxという名前のディレクトリがあり、wineコマンドを使用する場合はこのディレクトリの場所を指定して使用することができる。

標準的な書式

標準的な書式はrunの後ろに実行ファイルの場所とその引数(任意)となる。

$ mkdir -p /path/to/proton_prefix
$ STEAM_COMPAT_DATA_PATH=/path/to/proton_prefix /path/to/Proton\ X.Y/proton run /path/to/program.exe

runの代わりにwaitforexitandrunを指定すると、既に動いているプログラムがある場合に終了を待機してから開始し、同時に1つのプログラムしか動かないようにできる。

Steam用Windowsゲームの実行

Steam用のWindowsゲームを実行するにはSteamクライアントが動いている状態でSTEAM_COMPAT_CLIENT_INSTALL_PATH(Steamのインストール先)とSteamAppId/SteamGameId(先述のAppIdの番号)といった環境変数を指定して実行する。

$ STEAM_COMPAT_DATA_PATH=/path/to/steam_library/steamapps/compatdata/[Steam AppId]/ STEAM_COMPAT_CLIENT_INSTALL_PATH=/path/to/steam/installation SteamAppId=[Steam AppId] SteamGameId=[Steam AppId] /path/to/Proton\ X.Y/proton run /path/to/program.exe

Steam Linux Runtime (Soldier)を手動で使用

Steam Linux Runtimeは通常[Steamライブラリ]/steamapps/common/SteamLinuxRuntime_soldier/にインストールされる。この中のrunというコマンドが手動実行に便利で

  • runの後ろ(最後のオプションの後ろには--を付ける)に実行したいコマンド行を指定する
  • --filesystemオプションに指定したディレクトリを共有してコンテナ内からアクセス可能にできる(複数指定して複数のディレクトリを共有することも可)

として用いる。

$ STEAM_COMPAT_DATA_PATH=/path/to/steam_library/steamapps/compatdata/[Steam AppId]/ STEAM_COMPAT_CLIENT_INSTALL_PATH=/path/to/steam/installation SteamAppId=[Steam AppId] SteamGameId=[Steam AppId] /path/to/SteamLinuxRuntime_soldier/run (--filesystem /path/to/dir1 --filesystem /path/to/dir2) -- /path/to/Proton\ X.Y/proton run /path/to/program.exe

/usrの下など、一部の階層は共有できない。

--filesystemオプションには共有したいファイルの絶対パスを指定することもでき、共有したいファイルを含んだディレクトリをこのオプションで指定した際に他の既存のソケットなどがその階層に存在するとエラーが発生する場合などに有用。

GE版Proton(派生版)

概要

Protonをベースに、Wine Stagingのパッチの他に幾つかのゲーム用に外部から集めた追加のパッチ群(実験的なものも含む)を組み込んだ派生版Protonで、個人プロジェクト。

GitHubのリポジトリのページにはどのゲーム用の追加の修正があるかなどが具体的に示されており、ゲームのタイトル名(例:FFXV Steam)や特定の不具合(例:GTA V Keyboard input fix)などの形で一覧がある。ここに名前があるものはGE版Proton以外では動かない可能性が高い。

2021年時点では、Vulkanの子ウィンドウの処理を実装したパッチが適用されていることから、Wine上のVulkanアプリケーションやDXVK上のゲームなどがfixme:vulkan:X11DRV_vkCreateWin32SurfaceKHR Application requires child window rendering, which is not implemented yet!によって動かない場合は試してみる価値がある。

他には、非同期シェーダコンパイルによりフレームレート急激低下を緩和する非同期対応版DXVK(Steamのゲームごとの “起動オプション” にDXVK_ASYNC=1 %command%を入力して起動するなどして、環境変数DXVK_ASYNC1にして実行すると有効になる)を標準搭載しているため、フレームレートが急低下するゲームがある場合に試してみる価値がある。

DXVK_ASYNC=1指定は一部のオブジェクトの描画の遅れを招く原因になる他、マルチプレイヤーなゲームにおいての使用は推奨されない(マルチプレイヤーのゲーム用のアカウントがBAN処分を受ける原因になりうる)。

入手と配置

GitHubのリポジトリにあるリリース一覧から直接ダウンロードできる。

通常のProtonと同様にSteamクライアントから選択できるようにするには、Steamのインストール先の階層にあるcompatibilitytools.dディレクトリ(無ければ作成する)にProton-[バージョン]-GE-[バージョン]のディレクトリがあるように配置する。

[(Steam installation)]-+-[compatibilitytools.d]-+-[Proton-5.21-GE-1]
                       |                        +-[Proton-6.0-GE-1]
                       |                        |
                       |                        ...