原文链接
Video Encoding Acceleration in Cloud Gaming
论文要解决的问题
本文尝试在云游戏系统中,通过获取游戏引擎中的物体信息(包括位置、运动等信息),绕过服务器在最终为游戏的视频流编码的运动估计过程,以提高编码效率。
一些基本概念
云游戏也被称为游戏即服务(GaaS),大致可被分为三类:
- Remote Rendering GaaS(RR-GaaS):游戏逻辑、游戏渲染、视频编码等操作均在服务器侧执行,客户端侧只对视频进行解码和显示。
- loacl Rendering GaaS:客户端负责游戏渲染,而服务器侧只运行游戏逻辑。
- Cognitive Resource Allocation GaaS:部分计算操作既可以在服务器侧运行,也可以在客户端运行,这其取决于网络、客户端和服务器的条件。
运动估计:运动估计的基本思想是将图像序列的每一帧分成许多互不重叠的宏块,并认为宏块内所有象素的位移量都相同,然后对每个宏块到参考帧某一给定特定搜索范围内根据一定的匹配准则找出与当前块最相似的块,即匹配块,匹配块与当前块的相对位移即为运动矢量。视频压缩的时候,只需保存运动矢量和残差数据就可以完全恢复出当前块。(摘抄自百度百科)
传统的云游戏架构
如图所示,游戏在客户端和服务器端执行,客户端负责收集用户交互、解码视频;服务器端负责运行游戏逻辑、渲染游戏画面和将对游戏视频流进行编码。
该模式的缺点在于由于大量运算在服务器端运行,这会产生较大的功耗,可扩展性较低(无法同时服务较多的玩家)
本文所提的云游戏架构
主要
该架构在传统的云游戏架构中实现一个interface,用于收集游戏引擎中的信息并将其转换为视频编码器可以使用的信息。通过这些信息跳过或简化编码操作,比如运动估计过程,使得视频编码速度更快。
此外,需要在游戏引擎、interface和视频编码侧做如下操作或改动:
1) 游戏引擎:
主要收集object的位置和朝向,作为object info传输至interface。此外,游戏引擎需要生成一些其他数据,作为game info和game engine info传输至interface。
- game info:object的数量、每个物体的大小(这里应该是估计值)和游戏帧的大小;
- game engine info:游戏引擎的坐标系统
伪代码如下:
2) interface:
interface将接收自游戏引擎的信息转换为视频编码器可以识别的信息。此外,interface还需要接收一些视频编码器的信息,包括视频帧大小、视频帧坐标系统和FPS。
interface利用上述消息,在初始化阶段进行配置,使其能够将游戏信息转换为视频编码器的信息。
在配置阶段结束后,游戏引擎将object的信息发送至interface,interface对其进行转换。
interface的伪代码如下:
如上述代码所示,interface需要将游戏引擎产生的信息转化至笛卡尔坐标系,此外,需要计算一个用于转换object位置和大小的扩展因子。(这是由于游戏帧和视频帧的大小可能不一样)最后,生成object在连续两帧间的运动向量。
3)视频编码器侧:
运动估计从一个起始点开始,在参考框架中得一个区域进行搜索,以便于找到与当前分区最相似的区域。在H.264/AVC标准中,起始点由PMV计算得到,PMV由当前分区的上、左、右分区的运动向量计算生成。
所提方法
背景宏块(background MB):没有位于任何object边界内的宏块
前景宏块(foreground MB):位于任何object边界内的宏块
如果object的运动向量接近PMV,则可以推断object的运动向量和最终的motion vector(MV)相同的概率是很高的,因此可以跳过或简化运动估计过程。否则,需要执行完整的运动估计过程。
此外,也可以用此方法检测背景宏块。可以认为,所有背景宏块的运动向量是相似的,因此可以通过计算一个背景宏块的运动向量即可。
所提算法框图如下所示,其中Obj_MV表示object的运动向量(来自游戏引擎),BK_MV表示背景宏块的运动向量,Thr表示阈值。
需要注意的是,需要检测当前帧的背景宏块在上一帧是否也是背景宏块或者在某一个object的后面,如果是后一种,需要执行普通的运动估计过程。
此外,对于每一帧的第一个宏块,需要执行普通的运动估计过程,以获得BK_MV。
实验及分析
直接上结论:
- 本文所提方法在保证接近于传统H.264的编码的视频质量的同时,总编码时间降低了最多24%;
- 由于减少了运动估计过程,因此根据文中所提公式,本文所提方法是传统编码器所需能耗的44%;
- 本文所提方法不止适用于云游戏系统,而且适用于大多数可以提供object运动信息的应用场景。
个人认为本文设计的方法比较巧妙地解决了在云游戏系统场景下视频编码器中对object运动的冗余计算。但是该方法只适用于游戏渲染负载完全在服务器侧的场景,并不适合于offloading的场景。