This performance guide is is based on the following specs. Keep this in mind when trying on your own machine. Ryzen 7900, DDR5 5600 32GBx2, RTX 3090, PCIE Gen 4 NVME
For Linux gaming in general, I would highly recommend using CachyOS for their in house kernel, proton, and binary builds. Filepaths and package names may differ. But as with all things Linux, distributions are largely irrelevant as long as you know how to make.
While I cover some of the information here in sequential steps, it is still worth checking out Cachy’s guide on their wiki to learn more, even if you aren’t using their distribution. Especially if you are using an AMD GPU or Intel CPU since I will not be discussing those. https://wiki.cachyos.org/configuration/gaming/
I would be more than happy to add vendor specific sections if given the information and proof. However, I don’t feel comfortable reposting information I cannot verify personally. For whatever reason, with Darktide (cough cough Stingray) there is a lot of speculation and voodoo regarding performance on the Reddit, Steam community, and Fatshark forums. I would advise you to trust only the story your hardware tells and to do your own tests. That goes for anything written in this guide as well. The game is hard to run but it’s possible to get a good experience even on low end hardware with the right tweaks.
Part 1: System tweaks
First things first, install the meta package for gaming:
paru -S cachyos-gaming-meta
This contains proton-cachyos and automagically makes some system tweaks which are useful for gaming.
If using Zen 2 AMD hardware or later configure amd_pstate:
echo active | sudo tee /sys/devices/system/cpu/amd_pstate/status
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/energy_performance_preference
Enabling ADIOS for better load times:
Edit the config with your preferred text editor:
sudo vim /etc/udev/rules.d/60-ioschedulers.rules
Add in the information relevant to your system
# An example using my nvme drives. Replace with your own /dev/* special file name.
ACTION=="add|change", KERNEL=="nvme0*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="adios"
ACTION=="add|change", KERNEL=="nvme1*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="adios"
Then to save and apply changes immediately:
sudo udevadm control --reload-rules
sudo udevadm trigger
Install gamemode
paru -S gamemode
It’s worth noting that aninicy-cpp and gamemode can have conflicts. If you don’t want to get rid of aninicy, I would stop aninicy before a gaming session and manually restart it when you are done. However, I would recommend disabling the service entirely.
sudo systemctl disable ananicy-cpp.service
sudo systemctl stop ananicy-cpp.service
sched-ext eBPF userland schedulers
paru -S scx-scheds scx-tools
I recommend Lavd for most CPUs and bpfland if using an X3D CPU. However, after some extensive testing on my machine I found that rusty works the best for Darktide. YMMV. Set whatever you want to the default in /usr/share/scx_loader/config.toml. I would also set the default mode to Auto or Gaming.
I would also familiarize yourself with the scxctl tool. https://wiki.cachyos.org/configuration/sched-ext/ Since the schedulers are set in userspace using BPF, you can swap them in and out without rebooting. You can even swap them without closing a game! After editing run:
sudo systemctl enable --now scx_loader.service
scxctl start --sched rusty --mode gaming
Replace rusty with whatever you want, but I’d recommend at least trying it when playing Darktide. You can start and stop whatever scheduler you want, whenever you want. I won’t miss compiling kernels every week just for better gaming performance.
Speaking of which, CachyOS ships with tool called “CachyOS kernel manager” which lets you set your sched-ext scheduler in a GUI if you prefer. It also makes installing and customizing new kernels easy.
Networking tweaks
Darktide has pretty terrible netcode. Especially on Linux. While this may not work for everyone, these are some tweaks I’ve made to NetworkManager. I have had significantly better performance and less disconnections from matches.
sudo vim /etc/sysctl.d/90-gaming-networking.conf
then add
# low latency > throughput
net.ipv4.tcp_low_latency = 1
# better congestion control
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
#NOTE you need TCP_CONG_BBR3 enabled in kernel build
# reduce bufferbloat
#NOTE can try lowering or increasing for your machine
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 131072 16777216
net.ipv4.tcp_wmem = 4096 131072 16777216
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
Also disable power saving for your NIC
sudo vim /etc/NetworkManager/conf.d/wifi-powersave-off.conf
then add
[connection]
wifi.powersave = 2
Enable changes with
sudo systemctl restart NetworkManager
sudo sysctl --system
NTSYNC is practically mandatory. Most distros have it included as a module. Enable and test it with:
sudo modprobe ntsync
ls -l /dev/ntsync
This part is only neccessary for Nvidia GPUs but it is very important if you are using kwin_wayland.
I noticed a substantial uplift in performance and stability by disabling the GSP firware. Unfortunately, this means we cannot use the open drivers. The value of this will also differ by generation of Nvidia hardware. It’s worth doing research on your own card and seeing if GSP is known to harm its performance in Linux.
Add the following to your nvidia.conf file:
sudo vim /usr/lib/modprobe.d/nvidia.conf
NVreg_EnableGpuFirmware=0
On Cachy you can download the latest nvidia-***-dkms drivers. Otherwise you can manually do the .run file from Nvidia’s website, but I would recommend against that. After installing the drivers and rebooting make sure the following command returns “N/A”
nvidia-smi --query-gpu=gsp.mode.current --format=csv
Part 2: Advanced Darktide Tweaks
I stumbled onto this writeup on the steam community page a while back. It fixed most of the LOD loading problems I faced at the time, however I had a regression with the latest Hive Scum update. I’d recommend reading fully through this writeup and make changes which make sense for your hardware. If you are deadset on removing the LOD popping the only step I can fully vouch for is disabling the mesh streamer entirely which comes with a performance penalty.
You can also follow the new steps for updating the direct storage DLLs if you’re really struggling with load times. I didn’t notice any benefit, which would only be the case if Microsoft improved performance of the functions implemented in the game. Possible, but I didn’t care enough to diff the files. But hey, it’s an option if you need it.
Back up your conf files before messing with any of this stuff
I would only start messing with the mesh streaming stuff if you have significant performance or LOD problems.
https://steamcommunity.com/sharedfiles/filedetails/?id=3547365607
One thing I found that is not in the steam forums post since the launcher does not let you open settings on linux, we must set our max_worker_threads manually. The appdata contents will be in your proton directory such as ~/.local/share/Steam/compatibilitytools.d or ~/.local/share/Steam/steamapps/compatdata for official Valve and Cachy builds. This is where you will find user_settings.config in the Fatshark folder in roaming appdata. Set max_worker_threads to your system cores minus two. You can find this quickly by typing:
expr $(nproc) - 2
If you have a very high core count or an X3D CPU I would instead set the number to the amount of physical cores.
expr $(nproc) / 2
If you are a Nvidia GPU user who can’t take advantage of PROTON_DLSS_UPGRADE=1 and don’t want to use dlss-swapper you can also upgrade the DLSS scaling and frame generation DLLs by overwriting the files in the binaries directory. I can’t vouch for the frame generation but I noticed better visual quality after swapping the upscaling DLL. The updated DLLs can be found here: https://www.techpowerup.com/download/nvidia-dlss-dll/ https://www.techpowerup.com/download/nvidia-dlss-3-frame-generation-dll/
Part 3: Steam Settings
I would recommend setting proton to the latest version of Proton-GE if you have a Nivida GPU. As of the time of writing, GE-Proton10-28 has about 20% higher FPS and better stability than Windows 11 for my machine. As always, YMMV. It can be installed with:
paru -S proton-ge-custom-bin
Otherwise, use the latest version of mainline or cachy’s build. I’m unsure if the proton launch flags will work with other builds of proton.
Set the launch options for Darktide:
I don’t recommend just blindly copying and pasting launch options. Make sure you understand what’s important for your machine. Most of these are documented on CachyOS’ wiki and the rest can be found on Valve and GE’s Proton Github repos.
As of the time of writing (1/15) these are my current launch options:
LD_PRELOAD="" WINEDLLOVERRIDES="winepulse.drv=d" WINEALSA_CHANNELS=2 PROTON_FSR4_UPGRADE=1 PROTON_NVIDIA_LIBS=1 PROTON_DLSS_UPGRADE=1 PROTON_ENABLE_NVAPI=1 PROTON_USE_NTSYNC=1 PROTON_ENABLE_WAYLAND=1 MANGOHUD=1 gamemoderun %command% --lua-heap-mb-size 2048
Note that PROTON_ENABLE_WAYLAND is irrelevant for X11 systems. DLSS, NVAPI, and NVIDIA_LIBS are also not required for non-Nvidia systems.
The lua heap size increase is specific for Darktide and should be used even on Windows. This stops the game from OOM crashing which is very common, especially if you are using mods.
The WINEDLLOVERRIDES and WINEALSA_CHANNELS=2 commands are for if your in game voice chat is broken. This is currently the case for GE-10-28
LD_PRELOAD is (or at least, was) required for the game to start and prevent crashes. If you really want to enable steam overlay you can remove it. Though, there is performance improvement from disabling it. ENABLE_WAYLAND breaks the overlay currently anyways.
PROTON_USE_NTSYNC is extremely helpful for lag and stability in multiplayer.
In lieu of using the PROTON_DLSS_UPGRADE launch argument one could use dlss-swapper or manually upgrade the DLSS version which did improve performance for me.
PROTON_FSR4_UPGRADE=1 is helpful even for Nvidia systems if you are using frame generation.
Part 4: Modding
Enabling mods for Darktide is pretty easy. If you’re lucky and your distro is decent, you can just click the bat file and it will run in wine automagically. If not and you don’t want to mess with wine manually in a shell, someone has already done the hard work for you.
Download and run the latest version of this tool:
https://github.com/talon-d/darktideML-4linux/releases
and place it in your root game directory like you would with the normal windows mod framework. You may need to chmod +x handle_darktide_mods.sh for it to run.
After that it’s just business as usual. I’d recommend managing mods for Darktide manually.
Fin
The quality settings are largely determined by your hardware, obviously. I would recommend enabling mangohud and experimenting with different settings.
The three most important things for Linux are to disable RT, Vsync and enable Nvidia Reflex. Vsync will cause a lot of input lag. You’re better off limiting the framerate to your display refresh rate. Reflex+Boost will help a lot with the input latency. If your GPU is the bottleneck in your rig like mine, I would just enable Reflex without Boost.
With settings on mostly high and ultra performance DLSS I am able to get very smooth >100FPS@4k with my system even at high Havocs. If you need or want it, FSR frame generation works great in this game.
I hope you found this guide helpful. I am also working on a modding and performance guide for the Steam Deck so expect that soon.