WebRTC上的开源云游戏:p2p,多人游戏,零延迟



软件即服务,基础架构即服务,平台即服务,通信平台即服务,视频会议即服务,云游戏即服务又如何?已经有数种尝试创建云游戏(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 , , , -. , , , , , , , . . , , .



All Articles