Gaming on Gentoo Linux

最近は、LinuxでPCゲームをやるのもかなり現実的になってきたので、その知見についてまとめた記事を書こうと思う。

自分がGentooユーザーなので、細かい部分はGentooを前提にした話になっているが、概要はLinux全般でモダンなPCゲームをやる時の参考程度にはなるだろう。

前提

GPUドライバのインストール

普通入ってると思うが、GPUに合わせてxf86-video-amdgpuかnvidia-driversをインストールしておく。

vulkan driverのインストール

mesa (OpenGL-like graphic library for Linux) でvulkanフラグを有効化しておく。

vulkanは、DirectXとかOpenGLと同じレイヤーのAPIで、3Dグラフィックのためのlow level API。概ねOpenGLをよりモダンな方向に刷新するための規格という認識で良いと思う。

(少し調べてみた所によると、ハードウェアを直接制御するレベルのlow level APIなので、めちゃくちゃ難しいらしい……。)

で、何故これが必要かというと、詳しくは後述するがDirectXを利用したプログラムを動かすための、互換実装がvulkanに依存しているからだ。

vulkanがちゃんと動作しているかを確認するために、vulkan-toolsをインストールしておくこともオススメする。

sudo emerge -a vulkan-tools

vulkan-toolsのvulkaninfoというツールでvulkan driverの情報が取得できれば、正しくvulkanが動作する準備が出来ているはずだ。

vulkaninfo
==========
VULKANINFO
==========

Vulkan Instance Version: 1.2.162


Instance Extensions: count = 17
===============================
    VK_EXT_acquire_xlib_display            : extension revision 1
    VK_EXT_debug_report                    : extension revision 9
    VK_EXT_debug_utils                     : extension revision 2
    VK_EXT_direct_mode_display             : extension revision 1
    VK_EXT_display_surface_counter         : extension revision 1
    VK_KHR_device_group_creation           : extension revision 1
    VK_KHR_display                         : extension revision 23
    VK_KHR_external_fence_capabilities     : extension revision 1
    VK_KHR_external_memory_capabilities    : extension revision 1
    VK_KHR_external_semaphore_capabilities : extension revision 1
    VK_KHR_get_display_properties2         : extension revision 1
    VK_KHR_get_physical_device_properties2 : extension revision 2
    VK_KHR_get_surface_capabilities2       : extension revision 1
    VK_KHR_surface                         : extension revision 25
    VK_KHR_wayland_surface                 : extension revision 6
    VK_KHR_xcb_surface                     : extension revision 6
    VK_KHR_xlib_surface                    : extension revision 6

Steamをインストールする

最近のPCゲームプラットフォームは、ほとんどSteamかEpic Gamesのどっちかだと思う。Epic Gamesについては自分が手を出していないので、後でLinuxでプレイするための方法を軽く紹介だけしておく。

GentooでSteamクライアントをインストールするにはPortage Overlayを使う必要がある。所謂サードパーティリポジトリみたいなもの。

GentooでOverlayを使う方法はいくつかあるが、laymanを使うのが簡単だと思う。入っていないならインストールしておこう。

laymanを利用して、steam-overlayリポジトリを追加する。

sudo layman -a steam-overlay

これでsteam関係のコンポーネントがインストール可能になる。

steamのクライアントをインストールするにはsteam-launcherパッケージをインストールする。

use flagはこんな感じ。全部ONで良い。

equery uses steam-launcher
[ Legend : U - final flag setting for installation]
[        : I - package is installed with flag     ]
[ Colors : set, unset                             ]
 * Found these USE flags for games-util/steam-launcher-1.0.0.69:
 U I
 + + joystick     : Add support for joysticks in all packages
 + + steamruntime : Use the official steam runtime libraries
 + + udev         : Enable virtual/udev integration (device discovery, power and storage device support, etc)
sudo emerge -a steam-launcher

インストールが終わったらsteamコマンドで起動できる。/usr/share/applicationsにもエントリが追加されているはずなので、任意のデスクトップランチャーからも起動できるだろう。

Steam Play設定

Steamが起動できたら、Steam Playの設定を行う。Steamにはcompatibility toolという概念があり、それを利用してWindowsゲームをLinuxでも起動できる様にしてくれる。それを有効化しておく。この設定はゲームごとに上書きできるので、ゲームによっては設定を変える必要があるかもしれない。

f:id:joker1007:20210410204114p:plain

Protonについて

Linux上でWindowゲームを起動するためには基本的にProtonを利用することになる。Protonはwineをベースに作られたWindowsアプリケーションを起動するためのツールである。Protonではwineにゲーム周りで利用されるコンポーネントが諸々追加されている。

Protonは非常に優秀で、Steamで20本ぐらいゲームを買って試したが、全く起動すらしないというゲームはほとんど存在しなかった。一方で大体Window OSで直接起動するのに比べて、10%〜20%ぐらいの性能低下がある。

(追記: 優秀だというのは、wineに比べてという意味で、ゲームの種類によっては非常に苦手なジャンルがある。特にメモリ監視系のアンチチートツールが必須になる様なPvPのネットワーク対戦型ゲームは対応が困難だと思われる。自分が余りそのジャンルをやらないので、個人的には余り困っていない。)

WindowsのゲームではDirectXが必要なケースが大半だが、ProtonではDirectXの互換APIがデフォルトで組込まれている。昔はwined3dというコンポーネントDirectXの互換APIを提供していたが、最近のDirectX10以降はvulkanをベースにしたコンポーネントによって実装されている。そのためvulkan driverをインストールしておく必要があり、mesaのvulkanフラグを有効にしておく必要がある。

また、DirectXのバージョンによって微妙に実装しているコンポーネントが異なるのでややこしい。DirectX9, 10, 11はdxvkというツールによって実装されており、DirectX12はvkd3dというツールによって実装されている。

github.com

github.com

コントローラーの利用方法

自分が動作確認したのはPS4のDualShock4と、XBox One S Controllerなので、この二つを利用する方法を解説する。

PS4のコントローラーのドライバはLinuxカーネルに組込まれているので、それを有効にすれば認識する。具体的にはCONFIG_HID_SONYとCONFIG_SONY_FFを有効にすれば良い。

カーネルコンフィグの項目で言うと、 Device Drivers -> HID support -> HID bus support -> Special HID drivers にある。

XBoxの互換コントローラーの場合も組込みドライバがあり、JOYSTICK_XPADを有効にすれば良いのだが、これはかなり古いXBoxコントローラー限定で、XBox One S以降のコントローラーだと上手く動作しない。古いXBoxコントローラーや、サードパーティの互換コントローラーなら組込みのドライバで動作するはずなので、その場合はこちらを有効にすると良い。場所は、 Device Drivers -> Input device support -> Generic input layer -> Joysticks/Gamepads にある。

では、XBox One S Controllerならどうするかというと、xpadneoというオープンソースのドライバがあるのでこれをコンパイルしてインストールする必要がある。他にもいくつかドライバ実装があったのだが、これが一番ちゃんと動作した。

github.com

Gentooなら基本的にKernelは自前でコンパイルしているので、kernelモジュールをコンパイルする環境は揃っているはずなので、余り苦労は無いと思う。

リポジトリをクローンしてきて、hid-xpadneoディレクトリに移動し以下のコマンドを実行する。

make modules
sudo make modules_install

ちなみに、このドライバは何故かBluetooth専用なので、xpadneoを利用したい場合はBluetoothを利用できる様にしておく必要がある。

BTを利用する方法はこちらが参考になるだろう。

Bluetooth - Gentoo Wiki

BTが利用できる様になったら、ERTMと呼ばれる機能を無効化しておく必要がある。cat /sys/module/bluetooth/parameters/disable_ertmの出力がYになっていれば良い。無効になっていないなら、boot時のkernelパラメーターかmodprobeのconfigで設定を変更しておく。

例えばboot時のkernelパラメーターなら/etc/default/grubでこんな感じに設定する。

GRUB_CMDLINE_LINUX_DEFAULT=" bluetooth.disable_ertm=1"

xpadneoはかなりBluetoothドングルとの相性がシビアで、自分の環境だとBroadcomのチップの安定性が高く、CSR(Qualcomm傘下)製のチップはかなり不安定で微妙だった。

コントローラーや環境によって、ボタンのマッピングがおかしくなってる可能性があるので、レイアウト設定を確認しておく。

f:id:joker1007:20210410215506p:plain

f:id:joker1007:20210410215511p:plain

動作確認したゲーム一覧

大体、上記のことを実施すれば大抵のゲームは動作する。自分が実際にLinuxでプレイしたゲームは以下の通り。

  • Cyberpunk 2077
  • Dead Cells
  • DIRT Rally 2.0
  • Dyson Sphere Program
  • Ghostrunner
  • Hades
  • Hollow Knight
  • Metro Exodus
  • Noita
  • Nova Drift
  • Orwell
  • Oxygen Not Included
  • Satisfactory
  • ScourgeBringer
  • Skul: The Hero Slayer
  • Stellaris
  • ハードコア・メカ

(Linuxネイティブに対応しているものも含む)

何故かゲームによってはLinux Native対応を謳っていても、Windows互換モードじゃないと起動しないものが結構多くある。Dead CellsとかSkulとかはそんな感じだった。

また、Protonのバージョン次第ではコントローラーがちゃんと認識しない可能性がある。その場合、コントローラー設定をゲームごとに弄る必要があるかもしれない。

上記のゲームの中ではCyberpunk 2077が一番設定がシビアで2番目がMetro Exodusだった。設定が適切なら快適なのだが、噛み合わないとGPUごとハングアップしてPCが固まる場合がある。そうなると再起動するしかないので、AAAゲームを起動するのは結構大変。普通にWindowsデュアルブート可能にした方が楽と言えなくもない……。

Advance: mangohud, vkbasalt

mangohud: vulkan driverの情報や現在のfpsをoverlay表示できるツール

github.com

vkbasalt: vulkanのpost processingツール。レンダリングされた3Dグラフィックにシェードをかけたり、シャープフィルタかけたりできる。かなり画質が変わるのでゲームのよっては見た目がかなり綺麗になる。

github.com

上記の様なvulkan周りのツールを利用することで、ゲームの表示をカスタマイズできる。コンパイルしてインストールしたら、環境変数でオン・オフを制御できる。

ゲームごとの設定で、起動オプションを制御することができるので、そこに以下の様に設定する。

f:id:joker1007:20210410222346p:plain

ENABLE_VKBASALT=1 %command% 

vkbasaltはゲームによって多少相性があり、Cyberpunkみたいな設定がシビアなゲームで利用するとGPUごとクラッシュする可能性があるので、何でもかんでも使える訳ではないが、上手く動作するゲームならHDRモードみたいに色彩強化したり、かなりポリゴンの見た目を改善することができる。

Advance: SteamTinkerLauncher

Steam関連ツールは他にも結構色々あるみたいで、Vortexというmod管理ツールとか、ReplaySorceryというBackgroundでリプレイ動画をキャプチャしてくれるツールなどもある。

こういうのを逐一設定するのは面倒なので、SteamTinkerLauncher (stl) を利用して一括でオン・オフを管理することができる。

github.com

ここまでやる必要はあんまり無いのだが、関連ツールの情報が色々あるのでリポジトリを見ておくと便利なものが見つかるかもしれない。

stlはyadというgnomeのdialogウインドウを作るツールを使って色々設定できる様にしたshell scriptで、steamの起動の途中に挟み込んでゲームごとに色々な設定を読み込むランチャーとして動作する。

上記の起動オプションの項目を以下の様に設定する。

stl %command%

そしてゲームごとに色々設定するにはstl menuで起動した後、対象ゲームを選択し、GAME MENUから色々とオンオフしていく。異様に設定できる項目が多いので、正直自分も良く分かっていない。

Epic Gamesについて

自分はEpic Gamesを利用したことが無いので、実際どんな感じで動作させるのか良く分かっていないが、lutrisというツールを使うことで、Epic Gamesのゲームもプレイできるらしい。 Steamのprotonを利用することもできるはず。

Lutris - Open Gaming Platform

Linux:「Lutris」最強?のゲーム管理ツール | SlackNote