信息化时代,云计算已成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再进行游戏画面推流。