遊戲服務器上雲以及雲遊戲


3樓貓 發佈時間:2022-04-20 17:33:59 作者:風揚 Language

遊戲上雲

先前的遊戲服務部署都需要經歷兩個階段,一個階段是服務器硬件的採購以及服務器部署的配置,另一個階段是服務器的長期運維。服務器採購以及部屬配置的整個流程可能需要數個月之久,而且服務部署配置後需要專門的專家進行管理,這些流程對於一些中小型公司來說是很繁雜的,會造成很大的成本問題,這也就催生出了雲計算。
雲計算是一種基於互聯網的計算方式,通過這種方式,共享的軟硬件資源和信息可以按需求提供給計算機各種終端和其他設備,使用服務商提供的電腦基建作計算和資源。有了雲計算後,公司可以快速購買和配置所需的服務資源,從而花更多的資源在產品本身上。
遊戲上雲需要兩個技術,一個是虛擬化技術。虛擬化技術是一種資源管理技術,是將計算機的各種實體資源,如服務器、網絡、內存及存儲等,予以抽象、轉換後呈現出來,打破實體結構間的不可切割的障礙,使用戶可以比原本的組態更好的方式來應用這些資源。這些資源的新虛擬部份是不受現有資源的架設方式,地域或物理組態所限制。另一個是服務編排技術,一個遊戲服務的數量可能有成百上千個,而且不同的服務可能分佈在不同機器上,這會給服務管理造成很大的困難,所以需要服務編排技術來解決。

Docker

主要是三個部署方式,傳統部署、虛擬機部署以及容器部署
  • 傳統部署
比較典型的遊戲部署方式是服務器運行某個操作系統(如Ubuntu),然後各個遊戲服務以進程的方式直接運行在操作系統上,因為每個進程有自己的地址空間,所以服務間的內存空間是隔離的。這種部署方式的優點是簡單直接,服務沒有額外的一些運算,可以極大化的利用運算資源。但這種部署方式很難限制同一臺物理機上每個服務的資源使用(CPU內核的分配),存在資源爭奪情況,很可能因為某個服務佔用較大的計算資源導致其他應用不能正常服務,而且因為服務在同一個宿主操作系統中,各個服務可以通過讀取文件感知到對方的存在,存在很大的安全隱患問題。
  • 虛擬機部署
一臺專用服務器的CPU內核數可能有上百個或者上千個,為了更好利用一臺服務器的計算資源,避免不合理的競爭,所以引入一種完全虛擬化技術。虛擬化技術允許在物理機上同時運行多個次級操作系統。我之前用的比較多的虛擬軟件是VMware,VMware使用Hypervisor對硬件資源進行虛擬化,在使用VMwave的時候需要配置虛擬機的CPU、內存和網絡等資源,配好後在虛擬機中安裝對應的操作系統和軟件。每臺虛擬機可以配置自己要使用的資源,各個虛擬機的資源互不干擾,有一個很好的隔離效果,但是虛擬機需要安裝完整的操作系統,導致非常笨重。
  • 容器部署
比虛擬機更輕量級的是容器技術,如Docker。容器與虛擬機的主要差別是隔離層不一樣,虛擬機在物理層面上進行隔離,然後在之上安裝操作系統,容器是直接運行在宿主操作系統上,並不需要在額外安裝操作系統。Docker使用Linux隔離技術(CGroup和Namespace)來隔離各個服務,並直接調用操作系統的系統調用接口,從而降低每個容器的系統開銷,實現降低容器複雜度、啟動快、資源佔用小等特徵。
虛擬機和容器都使用鏡像來存儲運行環境。對於Docker來說,應用的源代碼與它的依賴都打包在Docker鏡像中。一個遊戲產品生命週期通常要經過開發團隊、測試團隊和運維團隊。早前沒有這樣的容器時候,服務的交付和升級都會導致多個團隊重複性的安裝新的依賴環境,而且一些老上線運營的遊戲都不敢輕易升級服務,生怕環境不一致導致服務運行不起來。Docker的出現很好的解決了環境問題,環境一次配置各地運行,這也降低了各個團隊的交付成本。

Kubernetes

Docker容器本身適合運行單個服務,但一個遊戲的服務有可能上千個或者上萬個,這些服務可以分佈在不同物理機上。如果只有幾個容器,那管理是非常簡單的,但當容器有成千上萬個的時候,很可能會導致容器管理和編排變得非常困難。對於一些大公司來說,因為要經常維護大型服務器集群,所以都會有自己寫的一套集群管理方案,這些方案包含服務資源配置、服務資源使用監控、健康狀態檢查以及服務的負載均衡等。
  • Kubernetes在遊戲界的使用
2014年Google開源了自己的容器編排與管理工具Kubernetes,Kubernetes開始逐步在互聯網界擴散,2017年之後大量互聯網公司開始應用Kubernetes。但奇怪的是遊戲界到現在其實也很少遊戲服務使用Kubernetes部署,難道是因為技術原因嗎?這個問題其實還有個大學老師專門寫了篇論文來探討,給出的結論是沒有技術原因,只是因為習慣問題。結合自己在遊戲界的經驗,這個結論是正確的,當然還有一些遊戲特性原因,遊戲相對於互聯網產品的主要差異是遊戲對網絡延時要求更高,使用Kubernetes的話會因為一些額外配置帶來網絡延時和處理延時。
之前遊戲部署更多的是使用腳本部署,一些Kubernetes主要支持的特性,如服務狀態監控和負載均衡功能,其實是遊戲服務內部功能就要支持的,並不需要外部工具在單獨支持,再加上一些大型遊戲公司的產品已經上線很久了,相應的服務部署工具也會不斷針對性完善,有了更熟悉的專用部署工具,而且Kubernetes本身是有上手成本的,一堆新概念要學習,所以遊戲界應用Kubernetes需要一定的過度時間。當然,現在的一些新遊戲都開始使用Kubernetes部署,像網易雷火的各個新遊戲也都用Kubernetes部署,使用Kubernetes部署可以更方便接入公有云,動態創建遊戲服務,更合理分配服務計算資源。
  • Kubernetes基本概念
Kubernetes的核心概念是pod,一個pod包含一個或者多個共享存儲和網絡的容器,以及怎樣運行這些容器的規範,pod是Kubernetes上最小的部署單元,其他的一些工作負載是多個pod的擴展組合。一個pod典型包含一個運行遊戲服務的容器以及一些額外的監控容器和發送log服務容器。
Kubernetes使用YAML來定義pod如何運行,如pod名字、使用端口以及IP、CPU和內存限制。Kubernetes的整個架構圖如下。

雲遊戲

雲遊戲現在使用越來越廣泛,以下會總結什麼是雲遊戲,怎麼實現雲遊戲以及目前雲遊戲的主要問題點和解決方案。

什麼是雲遊戲

隨著雲計算的發展,基於雲的一種遊戲新形態也被提出,那就是雲遊戲。雲遊戲是遊戲運行邏輯以及畫面渲染由遠端的服務器來完成,玩家設備不用在下載安裝遊戲軟件,只用從服務器接收音視頻流並在設備上播放。因為玩家設備並不用運行遊戲,所以玩家可以在任何地方用手機這種低性能的設備玩3A主機遊戲。雲遊戲跟傳統遊戲運行的最大差別是遊戲是否用本地設備的GPU渲染遊戲畫面。

雲遊戲工作原理

雲遊戲主要的工作是將服務器的遊戲音視頻傳輸到玩家播放設備上,就跟看電視差不多,不過雲遊戲跟電視的一個主要區別是:雲遊戲是有交互的,畫面需要根據交互來顯示,也就是需要實時渲染。大致的實現結構如下,下圖也是Google雲遊戲平臺Stadia的工作流程。
首先是對服務器遊戲的音視頻截取並將其編碼成流媒體數據,然後使用傳輸協議將數據傳輸到玩家設備上,玩家設備將數據解碼並將其播放。

畫面截取

畫面截取的方法很多,不同顯示驅動軟件或者不同操作系統有不同的畫面截取方法,比如GDI 抓圖、BitBit、DDA(Desktop Duplication API)、IDD(Indirect Display Driver)、DXGI等等,DXGI是Windows系統中用戶模式下最底層的圖形設備接口,可以直接獲取顯示器的內容。

音視頻編解碼

遊戲視頻數據根據不同遊戲畫面刷新頻率和分辨率有不同的大小,但通常都是很大,所以在網絡上傳輸時都會使用視頻壓縮編碼,目前使用比較廣泛的是H.264編碼格式,H264有參考幀的運動補償、幀內預測等新特性,視頻質量更高,碼率更低。相較於H.264編碼,最新的是H.265編碼,H265在架構上與 H264 相似,但H265在圖像分塊、變換編碼、預測編碼、熵編碼等模塊上提出了更優的算法,提高了編碼的壓縮率、魯棒性,在相同畫質的情況下理論上 H265能比H264節省一半的帶寬。H.264已經在手機、平板和瀏覽器上支持。音頻一般使用opus或aac來編碼。

數據傳輸

視頻和音頻編碼後得到一個個數據塊,然後將數據塊傳輸到客戶端上。Google的Stadia直接使用WebRTC傳輸音視頻數據。當然也可以直接使用原生TCP、UDP和KCP協議傳輸,對於一些實時性較高的產品,比如強競技遊戲,可以使用KCP傳輸,KCP傳輸數據要比TCP要快。相對來說流視頻使用UDP傳輸會更合適,因為遊戲畫面對準確性要求不高但是對實時性要求高。

畫面顯示與輸入採集

傳輸過來的數據塊解碼後得到原始的畫面和聲音,然後使用SDL呈現畫面和聲音。雲遊戲顯示質量可以分為分辨率以及幀率。良好的雲遊戲畫質需要高分辨率(至少1080P),實現分辨率的提升需要編解碼算法以及硬件能力的提升。遊戲的每一幀圖片是實時渲染的,每秒顯示在顯示器上的畫面數量,決定了雲遊戲的體驗(至少60FPS)。玩家的操作,比如鍵盤、鼠標、手柄等外設的信息採集也可以通過SDL實現,收集後將數據傳給服務器。

雲遊戲延時

實現一個能運行的雲遊戲平臺其實不難,現有的技術基本上很容易達到,但為什麼現在很少人用雲遊戲平臺玩遊戲了?拋開什麼商業模式和服務器成本不說,其中的主要原因是雲遊戲有很大的網絡延時,這樣的延時很影響遊戲體驗,尤其是一些對延時比較敏感的實時競技遊戲。2019年網易雷火的一位引擎大佬參加GDC時,現場測試了google Stadia雲遊戲平臺的延時,整個延時大概在200ms左右,雲遊戲帶來的額外延時是70ms左右,從視頻上來看延時還是很明顯的。據研究表明,遊戲延時需要保持在150ms以下才會有一個較好的體驗。
對於傳統的在線遊戲來說,延時是一個常見問題,比如移動延時。移動延時可以通過遊戲邏輯來降低,比如影子跟隨這類根據軌跡推算的算法。然而,這類算法並不適用於雲遊戲,因為雲遊戲僅僅傳輸遊戲畫面,沒有遊戲邏輯狀態。那麼是什麼造成了雲遊戲的網絡延時了?現在又有哪些解決方案了?

延時的主要原因

造成雲遊戲延時主要原因可以分為三類:
  • 網絡延時:玩家操作信息發送到服務器以及客戶單接收到服務器音視頻流總共時間。
  • 播放延時:玩家設備接收到編碼數據後到解碼數據並將其顯示到屏幕上的延時。
  • 處理延時:服務器接收到玩家命令處理命令並返回相應視頻的時間。

網絡延時

現在雲遊戲體驗最大的問題是網絡延時問題,網絡延時的主要原因是網絡包在路由器上路由,網絡包所經過的路由器越多,那麼網絡延時也會越大。由於雲遊戲基於雲計算發展,雲計算服務器分佈在不同地理區域上,所以可以用雲計算來選擇離玩家最近服務器來降低延時,這類服務器被稱為邊緣節點(Edge node),所形成的技術就是邊緣計算。廠家將遊戲部署在邊緣節點上,玩家在請求雲遊戲時,根據每個邊緣節點的延時和負載量來選擇延時最低的節點進行服務。根據Google Stadia的設計者表述,Stadia有7500個邊緣節點部署在合作的ISP廠商中。
邊緣計算是5G的核心技術之一,5G提供10Gbps以上的峰值速率、更佳的移動性能、毫秒級時延和超高密度連接。這樣的技術很好的滿足了雲遊戲的低延時和高帶寬的需求,因此5G技術的普及也會促進雲遊戲的進一步發展。

播放延時

播放延時主要取決於視頻編解碼以及視頻壓縮技術,目前使用廣泛的是H.264格式,像Stadia也是支持這個的。對於移動雲遊戲來說H.264還是不夠,主要的原因是,移動設備需要在嚴格的延遲要求下傳輸大量的數據,包括高質量和高幀率的圖形,這就會要求移動設備需要由一個更高的帶寬。
除了視頻壓縮技術之外,Stadia為了降低延時提出負延時(Negative Latency)技術,這個技術使用馬爾科夫鏈預測玩家在未來幾幀內的輸入,並且渲染對應的畫面返回給客戶端,如果在錯判時給出補償(快速隱藏錯誤的渲染)並且調整輸入渲染。負延時技術對一些單機遊戲來說比較友好,但是對於一些網絡遊戲來說比較難應用,因為遊戲變量不僅僅只有當前玩家的輸入。

處理延時

渲染一個遊戲畫面來說,肯定選擇最好的GPU來渲染,產生的延時也低。但是考慮到成本,不可能任何遊戲都使用最好的GPU來渲染,比如一些對渲染要求低的2D遊戲。現在雲遊戲廠商的持續虧本很大一部分成本來自於硬件配置的不合理使用,所以在保證遊戲體驗的前提下,合理的調度服務器的硬件配置可以降低成本,增加企業的營收。
虛擬化在整合遊戲資源和降低硬件成本方面起著至關重要的作用。目前為止,CPU,網絡接口和數據存儲虛擬化技術已經發展很成熟了,典型的像Docker容器技術。但是GPU卻是個例外,先前,研究人員針對虛擬機提出了一種新的GPU算法“vGPU“,“vGPU”的基本思想是將GPU計算資源分割成多個塊,並在圖形處理中引入CPU,以彌補GPU計算資源的損失。
GPU虛擬化可以增加服務器的遊戲併發能力,增強虛擬機的計算能力。GPU虛擬化的問題是阻礙雲遊戲實現令人滿意的延遲和響應時間的最大障礙之一。

網易雲遊戲

Google在2019年的GDC大會上正式發佈雲遊戲平臺Stadia,同年的11月份網易雲遊戲平臺也推出。目前在杭州使用手機玩網易雲遊戲平臺中的《光·遇》,網絡延時可以控制在50ms以內,網絡延時並不明顯,遊戲體驗也蠻好的。

總結

隨著雲技術的發展,相應的遊戲形式也發生了變化,產生了雲遊戲。雲遊戲因為不用下載遊戲,不限設備等特性,不斷發展壯大,但由於雲遊戲的延時和畫面質量問題,雲遊戲也面臨著挑戰。

參考

  • https://iopscience.iop.org/article/10.1088/1742-6596/1314/1/012211/pdf
  • https://arxiv.org/pdf/2009.09786.pdf
  • Youtube:Stadia Streaming Tech: A Deep Dive (Google I/O'19)
  • wikipedia:Cloud gaming
  • https://www.gdcvault.com/play/1027020/Cloud-Gaming-Where-Are-We
  • https://www.gdcvault.com/play/1026527/Gaming-in-the-Cloud-A
  • https://stadia.google.com/
  • https://www.gameres.com/889974.html
  • http://docs.kubernetes.org.cn/227.html
  • https://draveness.me/kuberentes-federation/
  • https://zhuanlan.zhihu.com/p/59924374
  • https://www.diva-portal.org/smash/get/diva2:1562637/FULLTEXT01.pdf
  • https://github.com/ksyun-kenc/liuguang
  • https://www-file.huawei.com/-/media/corporate/pdf/ilab/2019/cloud_game_whitepaper.pdf

© 2022 3樓貓 下載APP 站點地圖 廣告合作:asmrly666@gmail.com