日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Game as a Service —— 开源云游戏搭载WebRTC

發布時間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Game as a Service —— 开源云游戏搭载WebRTC 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

軟件即服務,基礎架構即服務,平臺即服務,通信平臺即服務,視頻會議即服務,那么,游戲即服務(Game as a Service)如何呢?已經有不少科技公司試水云游戲,最著名的要數Google的Stadia。對WebRTC來說,Stadia已經算是老朋友了,但是其他云游戲也能以同樣的方式運用WebRTC嗎?

Thanh Nguyen研究了他自己的開源項目CloudRetro在這方面是否可行。CloudRetro基于很受歡迎的WebRTC的pion庫。在這篇文章中,Thanh對他如何構建項目進行了框架性的回顧與思考,以及他在此過程中遇到的一些挑戰。

loudretro.io中megaman x4的屏幕截圖

作者:Thanh Nguyen

翻譯:LiveVideoStack

原文鏈接:https://webrtchacks.com/open-source-cloud-gaming-with-webrtc/

簡介

去年,谷歌發布了Stadia,這個想法的獨特性和創新性顛覆了我的認知。我一直在質疑當前的技術狀態怎么可能支持Stadia。為了揭開Stadia的神秘面紗,我創建了Cloud Gaming的開源版本。我想在接下來的文章中分享有關自己開發Cloud Gaming的一年時間的大冒險。

為什么云游戲才是未來

我相信云游戲不僅將很快成為新一代游戲,而且還將成為新一代的計算機科學甚至其他領域。云游戲是客戶端/服務器模型的頂峰。通過將游戲邏輯放在遠程服務器上并將圖像/音頻流傳輸到客戶端,它可以最大化后端控制并最小化前端工作。由此,服務器將負責處理繁重的任務,而客戶端將不再受硬件限制。

就Google Stadia而言,它實際上使用戶可以在YouTube等界面上玩3A游戲。可以將相同的方法應用于其他繁重的脫機應用程序,例如操作系統或2D / 3D圖形設計等,以便我們可以跨平臺在低規格設備上一致地運行它們。

可能的未來:你能想象在Chrome瀏覽器上運行Microsoft Windows 10嗎?

云游戲仍然面臨技術挑戰

游戲是少數需要用戶持續且快速反應的應用之一。如果我們單擊頁面時出現2秒鐘的延遲,這是可以接受的。直播視頻流通常會延遲很多秒,但仍然具有可用性。但是,如果游戲頻繁延遲500毫秒,該游戲將無法播放。


當前的目標是實現極低的延遲,以確保游戲輸入與媒體之間的gap盡可能小。因此,傳統的視頻流傳輸方法不適用于將圖像/音頻流傳輸到客戶端的情況。

云游戲運作原理

開源項目CloudRetro

我決定創建一個云游戲的POC,這樣我就可以驗證在這些嚴格的網絡限制下是否仍有可能實現以上所說的低延遲。我選擇了Golang作為我的POC,因為這是我最熟悉的語言,當然也因為它便于運作且開發速度快。當處理并發和流操作時,Go通道也非常有用。

這個項目就是CloudRetro.io:針對懷舊游戲的基于Web的云游戲服務開源項目。我的目標是希望帶來最舒適的游戲體驗,并將在線多人游戲等網絡游戲引入傳統的復古游戲。

你可以引用整個項目庫:https://github.com/giongto35/cloud-game

CloudRetro的功能性

CloudRetro使用Retro游戲演示了Cloud Gaming的強大功能并帶來了許多獨特的游戲體驗。

  • 便攜式游戲體驗

  • 即點即玩,無需下載安裝

  • 在瀏覽器上運行,無需任何軟件即可啟動

  • 游戲會話可以在多個設備之間共享,并存儲在云中方便下次游戲

  • 游戲可播可玩,并且多個用戶可以加入同一游戲

  • 類似于TwitchPlayPokemon的人群播放,但更實時,更無縫

  • 在線多人游戲,無需網絡設置即可進行離線游戲?,F在可以在CloudRetro上通過網絡與2位玩家一起玩《武士對決》

在不同設備上進行多人線上游戲的demo

架構

要求與技術配置

以下是我在開始這個項目前列出的一些要求。

單人游戲

這項要求聽起來并不相關且非常直接,但這是我的主要發現之一,它使云游戲擺脫了傳統的流媒體服務。如果我們專注于單人游戲,就可以擺脫集中式服務器或CDN,因為我們不需要將會話流分配給大量用戶。該服務不是通過將流上傳到攝取服務器或將數據包傳遞到集中式WebSocket服務器,而是通過WebRTC對等連接直接流向用戶。

低延遲媒體流

當我研究Stadia時,有些文章提到了WebRTC的應用。我發現WebRTC是一項非凡的技術,而且非常適合云游戲。

WebRTC是一個通過簡單的API為Web瀏覽器和移動應用程序提供實時通信的項目。它支持對等通信,并針對媒體進行了優化,并具有內置的標準編解碼器,例如VP8和H264。

我優先考慮為用戶提供最流暢的體驗,而不是保留高質量的圖形。該算法中有一些損失是可接受的。在Google Stadia上,還有一個步驟來減小服務器上的圖像大小,并且圖像幀在渲染給對等對象之前被重新縮放為更高的質量。

具有地理路由的分布式架構

無論壓縮算法和代碼如何優化,網絡仍然是導致延遲最關鍵的因素。該體系結構需要一種將最近的服務器與用戶配對的機制,以減少往返時間(RTT)。這樣的體系結構包含單個協調器和分布在世界各地的多個流服務器:美國西部,美國東部,歐洲,新加坡,中國。所有流服務器完全被隔離開來了。當服務器加入或離開網絡時,系統可以調整其分布。因此,在超高流量下,添加更多服務器可實現水平擴展。

瀏覽器兼容

在用戶需求極少的情況下,云游戲的表現是最好的。這也意味著能夠在瀏覽器上運行。瀏覽器通過刪除軟件和硬件安裝為用戶帶來最舒適的游戲體驗,同時,它還有助于在移動設備和臺式機之間提供跨平臺的靈活性。幸運的是,WebRTC在不同的瀏覽器中都具有出色的支持能力。

明確劃分游戲界面及服務

我將云游戲服務看作是一個平臺,一個能夠將任何插件插入的平臺。目前,我將LibRetro(https://www.libretro.com/)與云游服務集成在一起,因為LibRetro為SNES,GBA,PS等復古游戲提供了美觀的游戲。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

為多人、群體游戲和深層游戲鏈接服務的基于房間的機制

CloudRetro支持許多新穎的游戲玩法,例如用于復古游戲的CrowdPlay和線上多人游戲。如果多個用戶在不同計算機上打開相同的深層鏈接,他們將看到的正在運行的游戲與視頻流相同,而且他們可以像視頻中任何一個玩家一樣加入游戲。

此外,游戲狀態存儲在云中使用戶可以隨時在任何其他設備上繼續他們的游戲。

水平縮放

像今天的每一個SAAS一樣,云游戲必須被設計為可水平擴展。協調器-工作器的設計允許增加更多的工作器以服務更多的流量。

不可知的云

CloudRetro的基礎架構托管在各種云提供商(Digital Ocean,阿里巴巴,定制提供商)上,以對標不同的區域。我通過bash腳本對基礎架構進行了dockerize和配置網絡設置,以避免依賴任何一個云提供商。結合使用WebRTC的NAT遍歷,我們可以靈活地將CloudRetro部署在任何云平臺甚至任何用戶的計算機上。

架構設計

worker:(或者是上面提到的流服務器)生成游戲、運行編碼管道、并將編碼的媒體流傳輸給用戶。Worker分布在世界各地,每一個都可以同時處理多個用戶會話。

Coordinator:負責將新用戶與最適合的Worker配對并進行流傳輸,通過WebSocket與worker進行交互。

Game state storage:所有游戲狀態的中央遠程存儲。該存儲實現了一些基本功能,例如遠程保存/加載。

CloudRetro高級架構

用戶流

當新用戶在下圖所示的步驟1和2中打開CloudRetro時,協調器將被要求提供前端頁面以及可用Worker列表。之后,在第3步,客戶端使用HTTP ping請求計算所有候選者的延遲。此延遲列表隨后發送回協調器,以便它可以確定最適合為用戶服務的worker。在下面的步驟4中,游戲生成。WebRTC流連接是在用戶和指定worker之間建立的。

CloudRetro 在獲得后的用戶流

Inside the worker

在worker內部,游戲和流管道保持隔離狀態,并通過接口交換信息。當前,該通信是通過Golang通道上的內存傳輸過程完成的。下一個目標是進一步隔離–即以不同的過程獨立運行游戲。

Worker中各組件之間如何交互

主要部分是:

WebRTC:面向客戶端的組件,用戶輸入進入,服務器的編碼媒體輸出。

游戲模擬器:游戲組件。借助Libretro庫,該系統能夠在同一進程內運行游戲,并在內部掛鉤媒體和輸入流。游戲中的幀被捕獲并被發送到編碼器。

圖像/音頻編碼器:編碼管道,它在其中接收媒體幀、在后臺進行編碼并輸出編碼的圖像/音頻。

應用

CloudRetro依靠WebRTC作為骨干,因此在詳細介紹我在Golang中的實現之前,第一部分要專門介紹WebRTC技術。這是一項很棒的技術,可以極大地幫助我實現亞秒級的延遲流。

WebRTC

WebRTC旨在通過簡單的API在本機移動設備和瀏覽器上實現高質量的對等連接。

NAT Traversal

WebRTC以其NAT Traversal功能而聞名,它被設計用于對等通信,旨在找到最合適的直接路由,避免NAT網關和防火墻通過名為ICE的進程進行對等通信。作為此過程的一部分,WebRTC API使用STUN服務器找到您的公共IP地址,并在無法建立直接通信時回退到中繼服務器(TURN)。

但是,CloudRetro沒有充分利用此功能。它的對等連接不是在用戶與用戶之間,而是在用戶與云服務器之間。與典型的用戶設備相比,該模型的服務器端對直接通信的限制較少。服務器不在NAT之后,可以進行預打開入站端口或直接使用公共IP地址等操作。

以前,我曾經有讓這個項目成為云游戲分發平臺的野心。這個想法是想讓游戲創作者貢獻游戲和流媒體資源,用戶將直接與游戲創作者的提供者配對。以這種分散的方式,CloudRetro只是將第三方流資源與用戶連接的一種媒介。

因此當托管的負擔不再依賴CloudRetro時,它會具有更高的可擴展性。WebRTC NAT Traversal在簡化第三方流資源上的對等連接初始化時將發揮重要作用,進而使創建者毫不費力地加入網絡。

視頻壓縮

視頻壓縮是管道中必不可少的部分,它極大地有助于流暢的流媒體體驗。盡管不一定要完全了解VP8 / H264的所有視頻編碼細節,但了解其概念有助于闡明流速度參數、調試意外行為并調整延遲。

用于流服務的視頻壓縮具有挑戰性,因為該算法需要確??偩幋a時間+網絡傳輸+解碼時間的總和盡可能短。另外,編碼過程需要是連續并有次序的。某些傳統的編碼折衷方法并不適用–例如用較長的編碼時間換取較小的文件大小和解碼時間,或者是無序壓縮。

視頻壓縮需要忽略不必要的信息,同時將保真度控制在保持用戶可以理解和接受的范圍。除了對單個靜態圖像幀進行編碼之外,該算法還根據先前和將來的幀對當前幀進行了推斷,因此僅發送差異。如同在下面的Pacman示例中看到的,僅有差分點被傳輸。

?

以Pacman為例的視頻幀比對

音頻壓縮

同樣,音頻壓縮算法會忽略人類無法感知的數據。目前性能最佳的音頻編解碼器是Opus。Opus旨在通過有序數據報協議(例如RTP實時傳輸協議)傳輸音頻波。它比(mp3,aac)具有更高的質量、產生更低的延遲(通常約為5?66.5 ms)

Pion是一個將WebRTC引入Golang的開源項目。Pion不是簡單地包裝本機C ++ WebRTC庫,而是一種本機Golang實現,可以實現更好的性能、更好的Golang集成以及對基本WebRTC協議的版本控制。

該庫還提供具有許多出色內置功能的亞秒級延遲流。它具有自己的STUN,DTLS,SCTP等實現,以及QUIC和WebAssembly的一些實驗。這個開源庫本身是一個很好的學習資源,其中包含出色的文檔、網絡協議實現和示例。

由非常熱情的創建者領導的Pion社區非?;钴S,并且對WebRTC進行了許多高質量的討論。

如果你對此技術感興趣,請加入http://pion.ly/slack –你將學到許多新東西。

Write CloudRetro in Golang

Go在worker內的實施

Go Channel In Action

由于Go的通道設計精美,事件流和并發問題得到了極大的簡化。如圖所示,在不同的GoRoutine中有多個并行運行的組件,每個組件管理自己的狀態并通過通道進行通信。?

Golang的select語句強制每個game tick都處理一個原子事件,這意味著此設計不需要鎖定。例如,當用戶保存時,需要一個完整的游戲狀態快照。該狀態需要通過運行輸入保持不間斷,直到保存完成。在每個game tick中,后端只能處理保存操作或輸入操作,因此它也是同時安全的。

Fan-in / Fan-out

這個Golang模式與我的CrowdPlay和Multiple Player用例完全匹配。按照這種模式,同一房間中的所有用戶輸入都扇入一個中央輸入通道,然后將游戲媒體分發給同一房間中的所有用戶。因此,我們實現了來自不同用戶的多個游戲會話之間的游戲狀態共享。

不同會話之間的同步

Golang的劣勢

Golang并不完美,它的通道緩慢。與鎖定相比,Go通道只是處理并發和流事件的更簡單方法,但是通道并不能提供最佳性能。通道下有一個復雜的鎖定邏輯。因此,我通過在替換通道時重新應用鎖定和原子值來對性能進行一些調整,以優化性能。

此外,Golang垃圾收集器是無法控制的,因此有時會有一些可疑的長時間停頓。這極大地損害了該應用程序流的實時性。

CGO

該項目使用一些現有的Golang開源VP8 / H264庫進行媒體壓縮,并使用Libretro作為游戲模擬器。所有這些庫都只是使用CGO在Go中對C庫的包裝。你可以參考Dave的這篇博客文章(https://dave.cheney.net/2019/10/06/use-internal-packages-to-reduce-your-public-api-surface)。我現在面臨的問題是:

  • 即使使用Golang Recovery,也無法捕獲CGO的崩潰

  • 無法確定CGO下的細粒度問題就無法定義性能瓶頸

總結

我實現了揭開云游戲服務神秘面紗的目標,并創建了一個平臺,可以幫助我和朋友們在線玩懷舊的復古游戲。沒有Pion庫和Pion社區的支持,這個項目是不可能實現的。

我非常感謝Pion及其密集的開發,WebRTC和Pion提供的簡單API也可以實現平穩的集成。

盡管集成起來很簡單,但是P2P流媒體的確是計算機科學中一個非常具有挑戰性的領域。它必須處理IP和NAT等常年網絡架構的復雜性才能創建對等會話。在從事此項目的過程中,我積累了許多有關網絡和性能優化的寶貴知識,因此,我建議所有人嘗試使用WebRTC構建一些P2P產品。

CloudRetro可滿足我作為復古游戲玩家的所有用例。但是,我認為我可以改進項目中的許多方面,例如使網絡更可靠、性能更高、提供更高圖形質量的游戲或在用戶之間共享游戲。我正在為此而努力。

相關文章:

愛奇藝廣告變游戲——視頻流媒體如何加入云游戲戰局


LiveVideoStackCon 2020首屆音視頻線上峰會

2020.6.20-2020.6.21?

總結

以上是生活随笔為你收集整理的Game as a Service —— 开源云游戏搭载WebRTC的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。