(1/2) 在Ubuntu中运行低音频延迟Osu!和OpenTabletDriver

从2015年起我大概就一直有一台所谓的”Osu专机“,用尽可能纯净的系统来运行Osu,但效果一直不甚理想。虽然Osu并不消耗太多计算资源,但在不限帧的情景下太容易受到其他程序的干扰。从xp到win7到win10到win11,体感上是一代不如一代。

Windows下音频延迟也相对较高。我用过一段时间的REAL.exe,它把音频缓冲区从10ms降低到3ms以下,减少了视觉上打击效果产生和音效播放之间的延迟,效果还不错。但是REAL.exe需要手动强制安装声卡驱动,必须使用High Definition Audio Device这一generic驱动才可以正常运行。相对较新一点的板载声卡都与这一驱动的兼容性似乎越来越差(测试主板:Z690 Tomahawk WiFi DDR4、Z690 Edge WiFi DDR4、X670E-E),使我面临一个不能更新硬件的问题。

在Osu社区中,其实早已有人通过wine运行x86 Osu,这样做的主要好处是使音频延迟更低,另外Linux系统不像Windows那么臃肿,不容易出现卡顿。在过去两天中,我参照MarshNello的帖子,在我的“Osu专机”中进行了试装。另外安装了OpenTabletDriver来使用数位板(并且遇到了一点小问题,详见下文)。

硬件设备:

主板:MSI B550 Unify

CPU:Ryzen 5800X

内存:Acer Predator DDR4 3600MHz 16GB*2 16-16-16-36

显卡:Gigabyte GTX 1660 Ti Windforce

操作系统:

Ubuntu 22.04.1 LTS Desktop

准备工作

首先下载Ubuntu安装镜像并用rufus烧录进u盘里。

这里我选择了DD镜像模式写入。

安装Ubuntu

把烧录好的u盘插入待装的机器上,从u盘启动。出现如下菜单时选择Try or Install Ubuntu。

然后选择语言并点击install Ubuntu。

我选择了Normal installation,并且安装时自动下载更新。

这里我选择直接擦除磁盘并安装Ubuntu,图片里显示盘里已经有Ubuntu,是因为这是第二次试装时的录屏。我不想多系统共存,Osu专机里只应该有Osu相关的东西。

然后创建用户名密码,进行时区设置等一系列操作后重启,并在屏幕提示如下信息时拔出安装u盘。

安装显卡驱动

然后按照MarshNello的帖子操作,首先根据这个repo的文档安装适合自己的显卡驱动。我是N卡,所以右键桌面打开terminal运行:

sudo add-apt-repository ppa:graphics-drivers/ppa && sudo dpkg --add-architecture i386 && sudo apt update && sudo apt install -y nvidia-driver-515 libvulkan1 libvulkan1:i386

根据提示输入自己设置的密码提权后安装自动进行。

这里因为我开了secureboot,而N卡驱动属于“third-party”的非原生驱动,所以需要enroll一个Machine Owner Key:

其实就是要输个密码,开机时验证一下来核实是机器主人在注入这一驱动。

输入两次8-16位的密码后安装继续,装完直接重启。

开机进入这个界面:

可以看到有一个key0,这里选择Continue。

确认后提示输入之前设置的密码,这里输入不会有显示反馈,输完按回车即可,然后reboot。

重启后已经可以打开Nvidia控制面板。

安装Osu!

接下来安装Pipewire,随便开个terminal根据帖子操作即可。

sudo add-apt-repository -y ppa:pipewire-debian/pipewire-upstream
sudo apt update
sudo apt install -y pipewire libspa-0.2-bluetooth pipewire-audio-client-libraries
sudo add-apt-repository -y ppa:pipewire-debian/wireplumber-upstream
sudo apt update 
sudo apt install -y wireplumber
systemctl --user daemon-reload
systemctl --user --now disable pulseaudio.service pulseaudio.socket
systemctl --user mask pulseaudio
systemctl --user --now enable pipewire pipewire-pulse

然后安装git。

sudo apt install -y git

然后git clone MashNello的脚本。

git clone https://github.com/NelloKudo/osu-winello.git
cd osu-winello
chmod +x osu-winello.sh
./osu-winello.sh

装完后重开terminal输入wine-osu即可打开Osu。也可以通过快捷方式打开。简单看下帧数还不错。

安装OpenTabletDriver

我刚开始使用OpenTabletDriver官方文档的方式安装,出现了一些问题。

# Add the Microsoft Packages repository, use the URL related to your distribution
# 注意这一行命令可能会引起问题,先通读下面段落再决定是否执行
sudo dpkg -i packages-microsoft-prod.deb

# Install the .NET runtime
sudo apt update
sudo apt install -y apt-transport-https
sudo apt update
sudo apt install -y dotnet-sdk-6.0

# This will install the package, assuming you are in the correct directory
sudo apt install ./OpenTabletDriver.deb

# Reload the systemd user unit daemon
systemctl --user daemon-reload

# Enable and start the user service
systemctl --user enable opentabletdriver --now

这个安装方式让你添加微软的repository来安装.net的sdk(包含运行库),因为OpenTabletDriver基于.net 6.0。但Ubuntu22.4官方源也已经包含了.net。按照这一安装方式会出现OpenTabletDriver服务运行不起来的情况。

安装完之后我打不开OpenTabletDriver UX,运行systemctl –user status opentabletdriver发现服务运行失败

手动执行该服务的命令来看看是什么错误。发现提示找不到运行库,并提供了微软的文档链接。

而如果当初不手动添加微软的repository(跳过“sudo dpkg -i packages-microsoft-prod.deb”这一步),直接安装dotnet-sdk-6.0则不会出现这一问题。

我第一次试装时参照了这篇微软官方文档来进行一些弥补并最终成功解决了这一问题。

另外注意安装完dotnet之后可能需要重启。

一切正常后打开OpenTabletDriver UX配置数位板映射,和Windows端操作界面相同,不多做介绍。

另外我有遇到光标在两个位置闪烁的情况,在OpenTabletDriver官方FAQ中有解决方案。仅需在terminal中运行下面几行代码。

echo "blacklist wacom" | sudo tee -a /etc/modprobe.d/blacklist.conf
sudo rmmod wacom
sudo update-initramfs -u

这是因为系统自带的驱动也在同时运行,这两行代码将其禁用。

其他一些操作

可以通过直接复制的方式迁移数据。Chat、Skins、Screenshots这些按需操作,osu!.db、scores.db、collection.db以及./Data/r目录也需要完整复制过去。

./Data/r 录像文件

我原先的Osu是放在一块移动SSD中,由于我暂时还不想把songs文件夹整个拷贝一遍,所以把Ubuntu的osu根目录中设置了一个链接,把SSD中的songs目录映射到这里来。

具体执行的命令大约是这样。

ln -s /media/peppi/T7/Osu_200628/Songs/ /home/peppi/.local/share/osu-wine/osu!

另外由于linux音频延迟很低,使得hitsound比预期中(Windows环境下)更早响起,还需要把游戏内的universal offset调整一下才能使得hitsound和鼓点重合。MarshNello推荐从-35ms开始尝试,并根据自己体感进行调整。

好了,开屙!

关联阅读:

Share