一文讀懂雲渲染「串流」全鏈路時延及優化策略

​這是一個讓雲遊戲完美起步的時代。

雲遊戲作為產業內近年來炙手可熱的話題,具有「雲端運行、超高清、零延時、即點即玩」等眾多特性。

隨著 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等技術的有機結合,實現靈活的串流策略,達到用戶的極致體驗。

唯有實現串流技術的「延時自由」,才能讓身臨其境的雲遊戲,完美起步。