信息化時代,云計算已成IT業界不可撼動的基石。云游戲作為其衍生出的新興領域,正以其獨特的優勢,為游戲產業帶來革新性的變革。它將游戲渲染從玩家設備轉移至集中服務器,使得玩家無需高配設備,即可享受流暢的游戲體驗。
然而,高分辨率高幀率云游戲的發展也面臨著亟待解決的難題——編碼效率。由于云游戲的渲染和顯示是分離的。因此需要將服務器渲染好的畫面通過網絡傳輸給玩家的設備及顯示器進行顯示。而目前的網絡帶寬相較于原始視頻數據的大小是遠遠不夠的,進而需要將渲染好的原始視頻數據在服務端進行編碼壓縮再進行網絡傳輸,最終在用戶側解碼顯示。目前編碼主要有處理器的軟件編碼和顯卡的硬件編碼,軟件編碼往往效率較低,延遲也更高。而由于云游戲要求的高性能和低延遲特點,因而需要采用顯卡硬件編碼。這種情況下,顯卡既需要渲染游戲畫面又需要對畫面進行編碼,渲染單元和編碼單元是共享顯存大小,顯存帶寬以及PCIE帶寬,因此高負載時,會出現渲染單元和編碼單元搶占以上共享資源而造成渲染和編碼性能下降的問題。因此目前出現一種新型的實時渲染編碼方案,即獨立顯卡渲染游戲畫面,核芯顯卡再進行編碼推流。
雖然這樣能夠解決獨立顯卡包攬渲染和編碼的性能擠占問題,但是也導致了新問題的產生。獨立顯卡擁有自己的顯存單元,而核芯顯卡則需要共享內存來當作顯存使用。在顯卡渲染完游戲畫面后會將其存儲至顯存一塊特定的區域(該區域會映射成CPU虛擬地址以便于CPU訪問,默認256MB),顯存僅能映射256MB到CPU虛擬地址空間,需要頻繁換入換出,CPU再通過PCIE通道將這些數據復制到內存中的核芯顯卡使用的區域(內存共享給核芯顯卡使用的部分)。到這一步,核芯顯卡才能夠使用這些畫面數據進行編碼,編碼完后輸出到內存進行推流。
以上整個過程需要進行多次內存和顯存間的拷貝,而內存和顯存之間的數據傳輸,因此導致了獨顯渲染核顯編碼方案的性能損耗。
綜上所述,目前主流的云游戲渲染編碼的方法分別有以下問題
1、 傳統的獨顯渲染處理器編碼,由于處理器軟件編碼沒有專用的硬件編碼單元,因此需要占用處理器大量資源進行編碼,會影響游戲的渲染流程,而且軟件編碼的延遲也較高。
2、 傳統的獨顯渲染獨顯編碼,由于獨顯既要承擔游戲畫面渲染工作又要承擔視頻編碼,因此渲染單元和編碼單元會存在顯存資源,帶寬資源,供電資源等資源的擠占,因此會造成性能下降。
3、 傳統獨顯渲染核顯編碼,雖然獨顯和核顯各自承擔著渲染和編碼工作,但由于數據需要在顯存和內存間進行多次拷貝,且顯存僅能映射256MB到CPU虛擬地址空間,需要頻繁換入換出,因此會對內存和PCIE帶寬造成較大的壓力,并且也會消耗CPU資源去進行內存復制,因而也會有性能損耗。
本文所提出的基于顯存數據鏈路優化技術針對云游戲場景提升編碼效率的方法是通過優化顯卡編碼數據在顯存和PCIE數據交互的邏輯和方式來減少編碼數據對顯存占用以及對顯存帶寬、PCIE帶寬、CPU時間片的占用。
具體包括以下步驟:
1)啟用電腦BIOS的Above 4G Decoding技術,開啟這項功能后,對于 64 位 PCIe 設備,可以映射超過 4GiB 的地址空間。顯存的大小往往大于4GB,為了構建統一的尋址空間,我們需要將該項開啟,啟用芯片組 64 位兼容尋址。
2)啟用電腦BIOS的Resizable Bar技術,上文中提到顯存中有256MB空間將會映射到CPU虛擬地址中,以便于CPU對顯存數據的讀寫,CPU單次最多讀取256MB數據。啟用Resizable Bar后,能夠將顯存全部映射到CPU虛擬地址空間。
3)修改串流編碼程序中,核顯編碼的邏輯,將CPU中每一幀畫面的虛擬地址通過各核顯廠商提供的編程接口傳輸給核芯顯卡。核芯顯卡利用虛擬地址向CPU發送MMIO設備數據讀取請求,CPU將該虛擬地址轉換為物理地址,通過MMIO直接訪問顯存讀取該數據并傳輸給核芯顯卡,核芯顯進行編碼并將編碼完后的數據寫回內存,CPU再進行游戲畫面推流。