软件即服务,基础架构即服务,平台即服务,通信平台即服务,视频会议即服务,云游戏即服务又如何?已经有数种尝试创建云游戏(Cloud Gaming)的尝试,例如Google最近推出的Stadia。 Stadia对WebRTC并不陌生,但是其他人可以以相同的方式使用WebRTC吗?
Thanh Nguyen决定在他的开源项目CloudRetro中测试这种可能性。CloudRetro基于流行的基于Go的WebRTC库Pion (感谢Pion开发团队的Sean为本文提供帮助)。在本文中,Thanh概述了其项目的体系结构,还讲述了他学到了哪些有用的东西以及他在工作中面临的挑战。
介绍
去年,当Google宣布Stadia时,我大为震惊。这个想法是如此独特和创新,以至于我一直想知道现有技术怎么可能做到这一点。希望更好地理解此主题的愿望促使我创建了自己的开源云游戏版本。结果太棒了。下面,我想分享我为期一年的项目的工作过程。
TLDR:带有亮点的简短幻灯片版本
为什么云游戏是未来
我相信云游戏不仅将很快成为新一代游戏,而且还将成为计算机科学其他领域的新一代。云游戏是客户端/服务器模型的顶峰。该模型通过将游戏逻辑托管在远程服务器上并将图像/音频流传输到客户端,从而最大限度地提高了后端控制能力,并最大限度地减少了前端工作。服务器执行大量处理,因此客户端不再受硬件限制。
Google Stadia本质上可以让您玩AAA游戏(即高端大片游戏)在YouTube等界面上。相同的方法可以应用于其他繁重的脱机应用程序,例如操作系统或2D / 3D图形设计等。这样我们就可以在不同平台上的低规格设备上稳定运行它们。
这项技术的未来:您能想象Microsoft Windows 10是否在Chrome浏览器中运行?
云游戏在技术上具有挑战性
游戏是需要持续快速的用户响应的稀有领域之一。如果我们偶尔在点击页面时遇到2秒的延迟,那很好。实时视频流往往会滞后几秒钟,但仍提供相当多的可用性。但是,如果游戏经常延迟500毫秒,则根本无法玩。我们的目标是实现极低的延迟,以使输入和媒体之间的距离尽可能小。因此,传统的流视频方法不适用于此处。
通用云游戏模板
开源项目CloudRetro
我决定创建一个云游戏的测试样本,以测试在如此严格的网络限制下所有这些可能性是否可行。我选择Golang进行概念验证,是因为它是我最熟悉的语言,并且由于许多其他原因而非常适合此实现,正如后来证明的那样。Go很简单,而且发展很快。Go中的管道非常适合管理多线程。CloudRetro.io
项目是用于复古游戏的开源云游戏服务。该项目的目标是为传统的复古游戏带来最舒适的游戏体验,并增加多人游戏。 您可以在这里了解有关该项目的更多信息:https : //github.com/giongto35/cloud-game。
CloudRetro功能
为了展示云游戏的全部功能,CloudRetro使用了复古游戏。这允许各种独特的游戏体验。
- 游戏便携性
- 打开页面时即时播放;无需下载和安装
- 在移动浏览器中工作,因此无需运行任何软件
- 游戏会话可以在多个设备上共享,并存储在云中以供下次登录
- 游戏可以流式传输,也可以同时由多个用户玩:
- 像TwitchPlayPokemon这样的人群播放,只有更多的跨平台和更多的实时性
- 在线离线游戏。许多用户无需建立网络就可以玩游戏。现在,CloudRetro网络上的2位玩家可以玩Samurai Shodown
在不同设备上在线多人游戏的演示版
基础设施
需求和技术栈
, .
1.
, , . , CDN, . , WebSocket, WebRTC.
2.
Stadia, WebRTC. , WebRTC – , . WebRTC – , - API. , , VP8 H264.
, . . Google Stadia , .
3.
, , , . - (RTT). 1 , : , , , , . . , . , , .
4.
, . , . , . - . , WebRTC .
5.
. . LibRetro , LibRetro -, SNES, GBA, PS.
6. , crowd play (deep-link)
CloudRetro , CrowdPlay Online MultiPlayer -. deep-link , .
, . .
7.
SAAS , , . «-» , .
8.
CloudRetro (Digital Ocean, Alibaba, ) . Docker bash-, . NAT Traversal WebRTC, CloudRetro .
: ( , ) , . , .
: . WebSocket.
: . , , , /.
CloudRetro
CloudRetro 1 2, , . 3 HTTP ping. , . 4 . WebRTC.
. Golang . , .. .
:
- WebRTC: , .
- : . Libretro .
- .
- / : , , /.
CloudRetro WebRTC , , Golang, WebRTC. , .
WebRTC
WebRTC API.
NAT Traversal
WebRTC NAT Traversal. WebRTC . – , NAT- ICE. API WebRTC IP- STUN (TURN), .
CloudRetro . , . , . IP- , NAT.
Cloud Gaming. , . . CloudRetro , , . WebRTC NAT Traversal , .
– , . , VP8/H264, , .
, , + + , . , . – , , .
, , . , , . c Pacman’, .
Pacman
, , . Opus . , RTP (Real Time Transport Protocol – ). , mp3 aac, . 5~66,5 .
Pion, WebRTC Golang
Pion – , WebRTC Golang. C++ WebRTC, Pion Golang- WebRTC , Go, WebRTC.
. STUN, DTLS, SCTP .. QUIC WebAssembly. , .
Pion, , , WebRTC. , http://pion.ly/slack – .
CloudRetro Golang
Go
Go
Go, . , GoRoutines . . Golang (game tick). , . , , . , , . game tick’ , .
func (e *gameEmulator) gameUpdate() { for { select { case <-e.saveOperation: e.saveGameState() case key := <-e.input: e.updateGameState(key) case <-e.done: e.close() return } } }
Fan-in / Fan-out
Golang CrowdPlay Multiple Player. , . . , .
Golang
Golang . . Go – , . . , .
, garbage collector Golang , - . .
CGO
VP8/H264 Golang Libretro . C Go CGO. Dave Cheney. , :
- CGO, Golang RecoveryCrash;
- , CGO.
– , - . Pion Pion. . API, WebRTC Pion, . , , (P2P).
, P2P- . , IP NAT . , P2P- WebRTC.
CloudRetro , , , -. , , , , , , , . . , , .