Today we are releasing the first build of Proton 4.11, based on Wine 4.11. Among the usual variety of functional fixes[github.com]
, as well as a new Vulkan-based D3D9 implementation, it also includes a significant amount of work on reducing CPU overhead for multithreaded games. We observed the following performance gains when forcing a CPU-bound scenario on a high-end machine by reducing graphics details to a minimum:
We expect such gains to be reproducible on more realistic settings with a lower-end machine.
It also includes an experimental replacement for esync[github.com]
. Last year, as we were ramping up Proton development, we identified several blocking performance issues with multithreaded games. CodeWeavers then worked on developing the esync patchset to address them. While we think that was very successful, there's certain tradeoffs associated with it: because it relies on the kernel's eventfd() functionality, esync needs special setup and can cause file descriptor exhaustion problems in event-hungry applications. We think it also results in extraneous spinning in the kernel, compared to what an optimal implementation would be.
As such, we're proposing changes to the Linux kernel[lkml.org]
to extend the futex() system call to expose what we think is the needed extra bit of core functionality needed to support optimal thread pool synchronization. Proton 4.11 includes the fsync patchset, which will leverage this new Linux kernel functionality to replace esync when supported. For more technical details, refer to the link to the proposed kernel changes above.
We are also posting proof-of-concept glibc patches[github.com]
for upstream review and discussion; these patches expose the corresponding kernel functionality as part of the pthread library. We think that if this feature (or an equivalent) was adopted upstream, we would achieve efficiency gains by adopting it in native massively-threaded applications such as Steam and the Source 2 engine.
As usual, testing our theories and uncovering the last few bugs will involve a lot of testing; we have prepared packages for Ubuntu and Arch containing the necessary kernel patches to test fsync with Proton 4.11; for more information, please see this forum thread