基于 WebRTC 的云游戏开源项目(二)

2. 低延迟媒体流

在我研究Stadia时发现,有些文章提到了WebRTC应用。之后我得知WebRTC是一项革新技术,非常适合这个云游戏用例。 WebRTC是一个通过简单的API,为Web浏览器和移动应用程序提供实时通信的项目。它支持端对端通信,优化了媒体,同时还具有内置的标准编解码器,例如VP8和H264。

我认为要优先考虑为用户提供最流畅的体验,而不是保证高质量的图片。所以算法有些损失是可以接受的。Google Stadia有一个额外的步骤,能减小服务器上的图像大小,并且能在渲染给其他端之前,将图像帧重新缩放为更高的质量。

  1. 有地理路由的分布式基础结构

无论如何优化压缩算法和代码,网络仍然是导致延迟的最关键因素。该体系结构需要一种将最近的服务器与用户配对的机制,以减少往返时间(RTT)。该体系结构包含一个协调器和多个流服务器分布在世界各地:美国西部,美国东部,欧洲,新加坡,中国。所有流服务器都是独立运行的。当一个服务器加入或离开网络时,系统可以调整其分布。因此在高流量下,添加更多服务器可实现水平扩展。

  1. 浏览器兼容

在用户需求最少的情况下,Cloud Gaming表现最好,也就是能在浏览器上运行。浏览器通过删除软件和安装硬件,为用户带来最舒适的游戏体验。浏览器还有助于在移动设备和台式机之间提供跨平台的灵活性。而WebRTC在支持不同浏览器方面表现出色。

  1. 明确区分游戏界面和服务

我认为云游戏服务是个平台。一个人应该能够把任何插件载入平台。目前,我将LibRetro与Cloud Gaming服务集成在了一起,因为LibRetro能为SNES,GBA和PS等复古游戏提供酷炫的游戏模拟器界面。

  1. 基于房间的多人游戏机制,团战和游戏深层链接

CloudRetro支持许多新颖的游戏玩法,例如用于复古游戏的CrowdPlay和Online MultiPlayer。如果多个用户在不同计算机上打开相同的深层链接,他们会看到同一个视频流下正在运行的游戏,甚至可以像其中玩家一样加入游戏。

此外,游戏状态存储在云空间中。这使用户可以随时在任何其他设备上继续游戏。

  1. 水平缩放

像任何一个SAAS一样,如今此体系也必须设计为可水平扩展。协调器-工作器设计可以增加更多的工作器,以服务更多流量。

  1. 不可知的云

CloudRetro基础架构托管在各种云提供商上(Digital Ocean,阿里巴巴,定制提供商),以定位不同的区域。通过bash脚本,我dockerize了基础架构,配置了网络设置,这样就不用依赖任何一个云提供商。结合使用WebRTC的NAT遍历,我们就可以把CloudRetro灵活部署在任何云平台,甚至任何用户的计算机上。

结构设计

Worker/上述的流服务器:生成游戏,运行编码管道,将编码的媒体流传输给用户。worker实例分布在世界各地,每个worker都可以同时处理多个用户会话。

协调员:负责将新用户与最适合的worker配对,进行流传输。协调器通过WebSocket与worker进行交互。

游戏状态存储:即所有游戏状态的远程中央存储。该存储具备基本功能,例如远程保存/加载。

用户流

如下图所示的步骤1和2,新用户中打开CloudRetro时,协调器会接到请求:提供前端页面和可用worker列表。然后在第3步,客户端使用HTTP ping请求,计算所有候选者的延迟。延迟列表随后会发送回协调器,以便它确定最适合为用户服务的worker最后是步骤4,开始游戏,在用户和指定worker之间建立WebRTC流连接。

Worker内部

在worker内部,游戏和流管线保持隔离状态,通过接口交换信息。现在,该交换是通过Golang Channels的内存中传输,以相同过程完成的。我们的下个目标是进一步隔离,即以不同的过程独立运行游戏。

其中的主要部件是:

  • WebRTC:面向客户端的组件,加入用户输入,取消服务器的编码媒体。
  • 游戏模拟器:游戏组件。借助Libretro库,该系统能够在同一进程内运行游戏,并在内部挂钩媒体和输入流。能够捕获游戏中的帧,将其发送到编码器。
  • 图像/音频编码器:编码管道,系统在这里接受媒体帧,在后台进行编码,输出编码的图像/音频。

执行操作

WebRTC是CloudRetro的主构架。因此,在详细介绍我在Golang中的操作前,我想专门介绍一下WebRTC技术。这是一项很棒的技术,可以极大地帮助我达成亚秒级的延迟流。

文章地址:https://webrtchacks.com/open-source-cloud-gaming-with-webrtc/

原文作者:Thanh Nguyen

 

填写常用邮箱,接收社区更新

WebRTC 中文社区由

运营