云游戏作为产业内近年来炙手可热的话题,具有“云端运行、超高清、零延时、即点即玩”等众多特性。
随着 5G 时代的到来,以及中心云能力下沉至边缘云,高带宽、低延迟、高性能这些特性与云游戏紧密结合,突破实时云渲染的带宽和延迟问题,也赋予了云游戏更大的想象力。
就在今年 6 月,央视推出了首个大型沉浸式数字交互空间《三星堆奇幻之旅》,让观众摆脱本地硬件限制,仅通过一个 H5 页面带观众破屏穿越,“身临其境”探索考古现场。
沉浸式体验背后, “云渲染”和“串流”是绕不开的核心技术。
01 实现云游戏的关键技术:「串流」
“云渲染” 将大型沉浸式体验需要的 3D 渲染应用部署在云端,使得观众看到和交互的画面,都是云端实时渲染计算出来的。
“串流” 是实现云游戏的关键方式,通过数据中心将游戏渲染场景转换成视频流,再通过传输网络推送到用户终端显示。
同时,用户在实时显示的图像上,通过键盘鼠标、触控等方式传输指令到云端,实时控制 3D 渲染应用做出相应的响应。
整个过程延迟通常小于 100ms。
云渲染「串流」技术通常应用在云上考古、云旅游、虚拟数字人直播、智慧城市数字孪生应用和云游戏的场景。
用户不必部署昂贵的高配 PC 或手机,通过网页访问或者扫描二维码的方式,即刻便可享受细腻、清晰、流畅的高清视频体验和实时的操控效果。
云渲染串流主要采用启动成功率、错误率、资源利用率、首帧时间、时延、码率、分辨率、画质、卡顿率、音画同步差等指标来衡量业务的好坏。
本文对重点对「串流」全链路时延进行分析,并介绍主要的优化策略。
02「串流」的全链路时延
作为云渲染串流技术体验的基础,超低延时的要求带来了巨大的挑战。
云渲染串流的全链路时延主要可拆解为以下各个环节:传输时延、指令时延、编码时延、封包时延、收包时延、解码时延、帧间隔时延。
传输时延:媒体流与指令流传输的时延。用户通过阿里云广泛部署的边缘节点就近接入,一般状态下 rtt(往返时延)可稳定控制在 10ms 以内,即单向网络延迟 5ms;在资源繁忙时,存在中心调度到较远节点的情况,偶尔出现部分用户 rtt 在 30ms 左右的情况,即单向网络延迟 15ms。
指令时延:云上的 unity/ue 渲染应用的响应客户端的触控事件的时延。指令可以通过进程间通信的方式,打通串流应用层和渲染程序,避免操作系统交互,实现虚拟化操作,指令时延控制在 1ms 以内。
编码时延:视频编码的处理时延。采用 GPU 硬件加速、采集编码 Zero Latency 的策略,通过对渲染应用的 direct API 挂钩的方式,实现 GPU 内部纹理视频数据的采集和编码闭环,避免了 GPU 和 CPU 之间原始大数据量的视频拷贝,节约了功耗,控制整体编码时延为 2ms 以内。
封包时延:视频编码数据封装 RTP 到服务器音视频发送的时延。采用更适合云渲染的拥塞控制策略,实时精准调节网络缓冲区,可以降低数据包在服务器的缓存时间为 5ms 以内。
收包时延:用户接收端的 RTP jitter buffer 的时延。该时延保持在 20~30ms,即缓存 1~2 帧的状态,以应对乱序、丢包、抖动等网络环境,在保证流畅度的前提下,最大限度降低网络时延。
解码时延:视频解码处理时延。不同设备的视频解码策略不同,在中端机型软解高清视频的平均解码时延为 7ms 左右,这是统计时延结果,在 H5 端上改进空间较小。
帧间隔时延:编码算法时延。在 60fps 帧率的情况下,每两个视频帧之间的时间间隔固定为 16ms,也就是说指令响应到视频编码之间一定会存在 0-16ms 的时间延迟,这是由视频编码本身机制引起的,理论上不能减少。
总之,在 1080P 60fps 的场景下,云渲染串流全链路时延 = 传输时延 rtt(10-30ms)+ 指令时延(1ms)+编码时延(0-2ms)+封包时延(0-5ms)+收包时延(20-30ms)+解码时延(7ms)+帧间隔时延(0-16ms)= 38ms 到 90ms 之间,可以实现 100ms 以内的体验效果。
03 串流时延的精准「优化」策略
对于「串流」技术的全链路时延,优化策略主要包括:编码优化、前处理优化、采集优化、指令优化、传输优化。
❖ 编码优化
在视频编码策略方面,影响编码延时的主要优化有:
1. 用 slicethread 代替 framethreads,提高编码效率,降低计算处理时延。
2. 关闭 lookahead 线程,避免线程预测的帧缓存。
3. 关闭 B 帧 (HEVC 可以支持 GPB,替代普通的 B 帧),以降低后向参考的算法时延。
❖ 前处理优化
前处理优化主要指的是「窄带高清」处理,通过 CPU+GPU 联合计算,进行视频原始域的计算优化,在满足码率降低 35%,VMAF 提高 10%效果的同时,最小化计算处理时延,效果如下图。
在云渲染场景下的窄带高清处理,可以实现 Zero-latency 编码与画质的平衡,使主客观画质都有显著提升。同时窄高高清处理,可以降低视频编码码率,降低网络传输的带宽压力。
❖ 采集优化
在视频采集方面,通过对用户渲染进程远程注入视频采集 hooker,对 preset 函数设置函数钩子,在函数钩子中将 back buffer 拷贝到共享纹理中,供硬件编码器使用的方式,避免了 GPU 和 CPU 之间的 yuv 原始视频数据的拷贝。在 GPU 内部完成视频采集、视频处理与视频编码,全过程纹理数据处理, 采用 CUDA 硬件视频编码,并行加速编码过程,降低编码时延。
蓝色部分为用户渲染引擎进程,完成 GPU 的纹理渲染;橙色部分为阿里云云渲染引擎进程,完成钩子注入、网络收发和业务逻辑;黄色部分为 GPU 运算,用户进程和阿里云进程两者通过共享纹理进行数据通信,并实现硬件编码加速。
❖ 指令优化
在指令操作方面,我们根据不同用户需求,提供「非侵入式」和「侵入式」两种方案。
非侵入式方案通过 hook 到用户渲染进程的方式,通过挂载 GetKeyState、GetCursorPos 等一系列 win api 键鼠状态函数,用来传递用户控制指令流,避免内核态与用户态的数据交互。
非侵入式方案的优点在于应用适配性好,用户不需要二次开发;缺点是需要依赖不同系统版本的 api。
侵入式方案是指用户渲染引擎可以选择集成阿里云注入.dll 的方式,通过同主机进程间的 socket 通信方式,实现自定义用户集成消息解析,降低指令解析时延。
侵入式方案应用能实现云原生化,但其具有一定的技术门槛,需要开发集成阿里云的方案。
❖ 传输优化
在传输优化策略中,主要包括指令流 QoS 保障、带宽估计、拥塞控制、视频缓存精准估计、FEC 纠错算法改进、特殊包冗余保护。
指令流 QoS 保障:针对移动事件需保证执行顺序,在网络乱序场景下,允许丢包,但通过序列号确保执行最新事件;针对按键、点击事件,会启用重传策略,保证本地操控与最终显示的最终一致性;对于组合事件消息进行消息合并,减少发包量,同时通过冗余策略能保证丢包时候的到达率。
带宽估计:采用 BBR 算法,在带宽上探时,不会造成 rtt 的较大变化,避免传输延迟的增加。同时,优化 BBR 算法的带宽下探策略,在探测最小 rtt 时,不停发数据,保障媒体数据稳定传输。在带宽探测过程中,采用快速收敛策略,优化最大带宽计算方法并缩短带宽估计的反馈时间为 100ms,快速探测带宽。
拥塞控制:调整 pacer sender 的周期判定条件,在网络状态良好时,提高单次数据发送量,减少单帧发送时间。
视频缓存精准估计:在视频解码端,采用卡尔曼滤波器动态估算帧间隔时间,精准设置 jitter buffer 大小,减少不必要的时延。
FEC 纠错算法改进:使用 cm256 RSFEC 算法,比传统 RSFEC 算法 cpu 利用率降低 95%,最大化提高分组数量。在云渲染大码率的场景下,减少前向纠错的计算时间。
特殊包冗余保护:针对特殊包,例如 NACK 包及重传包、I 帧及重传 I 帧、用户自定义指令和操作指令等,分级传输,通过专用冗余通道传输,以局部带宽提升为代价,以保障最小时延的整体传输到达率。
针对云渲染串流场景,阿里云开发了专门的延迟评测工具,通过云渲染串流的通用指令 API,可以完成上述全链路时延测量。该工具由服务端测试渲染应用、测试应用客户端和统计处理工具组成。
服务端测试渲染应用:实时获取客户端上传的毫秒时间,并通过云渲染串流显示上传的计时时间。
测试应用客户端:实时显示毫秒计时,并通过云渲染串流的 API,例如鼠标坐标设置 API,实时上传毫秒时间到服务端。
统计处理工具:包括定时截图程序、时间戳自动识别程序和延迟卡顿数据处理程序完成自动化测试和数据收集和统计,可以评测第三方云渲染系统,并获取延迟和卡顿的结果。
右侧为工具运行效果,图上示例中的时间延迟为 706290(客户端) - 706231(服务端) = 59 ms。通过 OCR 识别和长时间大数据量的测试,可获取云渲染串流时延的统计结果。
虽然目前云渲染串流时延 100ms 可以满足用户的体验需求,但是 100ms 仅仅是及格线而已。
在降低时延方面,大有空间可为。
比如:
在内容生产端,通过开发云原生渲染应用,实现“内容生产+编码传输”的闭环应用,会进一步提升指令反馈和图像显示的实时效果。
在云端,同一张网实现多业务混跑,降低用户接入节点的成本,减少就近接入的距离,可以实现网络延迟的最小化。
在用户端,云渲染应用以 h5 接入为主,而在 h5 端,可以通过 webcodec、webtransport、webrtc 等技术的有机结合,实现灵活的串流策略,达到用户的极致体验。
唯有实现串流技术的“延时自由”,才能让身临其境的云游戏,完美起步。