一文读懂云渲染“串流”全链路时延及优化策略

 

这是一个让云游戏完美起步的时代。

云游戏作为产业内近年来炙手可热的话题,具有“云端运行、超高清、零延时、即点即玩”等众多特性。

随着 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等技术的有机结合,实现灵活的串流策略,达到用户的极致体验。

唯有实现串流技术的“延时自由”,才能让身临其境的云游戏,完美起步。

{{o.name}}
{{m.name}}

猜你喜欢

转载自my.oschina.net/u/4713941/blog/5586152