是的,但是它能运行《毁灭战士》(DOOM)吗?
这个无处不在的问题就是几年前我在LiveKit的第一次黑客马拉松上问自己的。我能通过LiveKit玩《DOOM》吗?对于一个24小时的比赛来说,这可能有些雄心勃勃,但我必须解决这个“成人礼”。所以,我与我们常驻的WebRTC专家Raja合作,着手构建一些伟大的东西。
经过漫长的一夜,它成功了;这是一个弗兰肯斯坦式的WASM设置,在浏览器中运行,并允许使用LiveKit数据通道在原版《DOOM》上进行多人游戏。它延迟得要命,但它奏效了!我记得我们甚至没有在黑客马拉松中获奖,而且既然我已经(大部分)解决了这个问题,这个项目就被遗忘了。
几个月后,我开始思考Valve和Steam Deck在Linux游戏方面取得的进展,以及一些云游戏服务所展现的巨大潜力。然后我开始想……LiveKit能否为云游戏服务提供动力?
一开始就有一个明显的缺点:成功的云游戏服务使用点对点WebRTC,所以没有明显理由使用LiveKit以SFU为中心的模型。但如果我们把LiveKit和游戏服务器放在一起,以抵消延迟问题呢?我们可以提供更具互动性的体验,让多名玩家在同一个LiveKit房间中,其中一个或多个玩家能够控制游戏;它甚至可以复活一个古老的东西:分屏合作!
所以这次目标可能不是《DOOM》;可能是一些更具互动性的东西。比如说《传送门2》的合作模式……
要达到通过LiveKit实现云游戏可行的程度,我必须弄清楚从哪里开始;Headless Steam Service项目给了我巨大的帮助。那个仓库里有大量有用的信息,以及更好的代码,帮助我迅速上手。
所以,我有一个无头Steam Docker容器,可以在VM上运行。接下来,我需要一个连接到VM的GPU来提供图形渲染并使用编码器。我比较了许多提供商的价格,发现GCP us-west1-b区域的NVIDIA T4 GPU是当时唯一有货且相对便宜的。
LiveKit最近的云端点在美国西海岸的旧金山,但我决定先用这个设置,如果需要再进行调整。两个区域之间的RTT约为35ms,所以如果输入出现卡顿或其他延迟问题,这将是第一个需要调整的地方,可以通过与OSS LiveKit colocating或将VM移动到更近的数据中心。
无头Steam准备就绪后,我还需要两部分:输入控制,以及一种捕获VM屏幕并将其传输回LiveKit房间的方法。
控制相对简单。为了实现这一点,我使用了Javascript来捕获客户端浏览器上的鼠标、键盘和游戏手柄输入,然后通过LiveKit数据通道发送这些输入。在VM上,我使用server-sdk-go连接到房间并监听数据通道上的输入。一旦接收到输入,我使用这个已存档仓库的一个分支,将输入发送到虚拟的udev设备。
屏幕捕获也非常直观,这要归功于gstreamer LiveKit sink所做的工作。我安装了Nvidia设备驱动程序和Cuda库,以确保我可以使用gstreamer插件nvh264enc进行硬件辅助的h264编码。
我尝试了几个不同的软件编码器并进行了各种调整,但始终无法获得硬件编码所提供的响应速度。我还必须修剪管道以避免缓冲;丢包比延迟到达的视频更可取。感谢Theo解决了这个问题。
我还(有点不幸地)在gstreamer管道中设置了较低的比特率和分辨率。LiveKit gstreamer插件尚不支持Simulcast,所以我热切期待这个拉取请求的落地。
现在,我已经准备好把所有东西整合在一起了!对于前端,我使用了LiveKit Meet,并对其进行了修改以添加javascript和数据通道管理。我将其运行在VM上,VM正在处理编码、无头Steam和输入管理的所有其他任务。
最初控件有一些卡顿,我不得不花费大量时间调整游戏手柄的死区设置以消除漂移。此外,感谢Jonas帮助我弄清楚如何在前端客户端将播放延迟设置为零,以确保控件尽可能灵敏。
我做了大量的“测试”(当测试实际上只是玩游戏时,感觉很棒),我告诉Russ,我成功的标准是,我能否沉浸在《传送门2》中,忘记它是在LiveKit云上运行的事实,以及控件是如何工作的,以及是否正在丢帧。
这真的发生了;我花了两个小时和一个朋友通关了许多合作关卡,最后当我们不得不跳舞才能退出其中一个关卡时,我才从沉浸感中脱离出来,因为控制器输入没有映射那个按钮。
通过LiveKit云玩《传送门2》
为了使效率更高,还有更多的工作可以做。Simulcast可以实现更高的分辨率。如前所述,与LiveKit云 colocating将立即消除大约35ms的延迟。
然而,我一直没有去做这件事,因为在那种延迟下它运行得足够好。所有这些都被打包成一个Docker容器,我很想在更高性能的机器上进行测试,但大多数租用消费级GPU的SaaS服务不允许特权容器,所以我现在只能困在性能不足的VM上。
所以,是的,它成功了。通过LiveKit玩《传送门2》合作模式,几乎没有卡顿。它可以更好吗?当然——还有很多调整和优化空间。但事实上,我能和朋友一起玩上几个小时的游戏,并忘记这一切都是由LiveKit驱动的云设置上运行的?这对我来说就是胜利。如果你想查看代码,它都在这里开源。
是的,在你问之前——我确实启动了《DOOM》来确保它能工作。重金属背景乐可选用。