徐嬋嬋
(中國傳媒大學 計算機與網絡空間安全學院,北京 100024)
渲染,已經成為了一個商業化的產品。動漫、電影以及游戲產業最重要的一個階段就是進行高質量的且漫長的三維渲染流程。震撼人心的三維大片需要同樣震撼人心的三維效果畫面來做硬性支撐。渲染是這些產業不得不開銷的奢侈品,其耗資巨大,貴到以秒來計算,貴到與真人實景的傳統大片一樣燒錢。渲染昂貴是因為離線的三維渲染是一個巨大的工程,即使用專門的圖形渲染器,一幀高質量的圖像渲染十幾小時、甚至幾十小時都很有可能,數十甚至數百GT的源文件的渲染工作是不可能靠個人的“超能本”在有效的時間內完成的。渲染服務器集群的建立往往很困難,且不論硬件機器的購買所需,單是一臺服務器配備上完備的正版三維渲染軟件就是一筆不小的開銷。這種渲染服務器集群的有效工作時間常常是很少的,閑置的機器會占用很大的空間,一旦全部工作起來,耗電量卻又是驚人。根據計算機硬件發展的摩爾定律,購買的機器在五年之后又需要更新換代以適應新的渲染需求。
如何讓低端硬件配置的終端機,如手機、PAD、PC機,以及限制計算能力的應用平臺,如網頁等,也能實現高端配置的主機才能獲得的高質量的渲染效果,一直是研究人員努力的方向。基于本地的渲染方式或基于客戶端的渲染方式已遠不能滿足這種需求,研究人員開始讓服務器承擔一部分渲染工作,這就是一種基于服務器端的渲染方式。
當前流行的云計算就是一種基于服務器端的計算方式。而云渲染只不過是把三維渲染放到了網絡上,服務器端執行的是渲染計算。云渲染的核心思想是:把大量用網絡連接的計算資源進行統一管理和調度,構成了一個計算資源池,以此為用戶提供按需服務[1]。在云渲染中,專有功能集中裝備在云端的渲染器上,而本地只需要裝備一個瘦客戶端。所謂瘦客戶端是指客戶端-服務器網絡體系中一個基本無需應用程序的計算機終端,它只傳遞鼠標和鍵盤的輸入信息給服務器,并不會在本地進行過多的數據處理[2]。客戶端把要渲染的數據和設置的參數傳到云端服務器,云端服務器會完成渲染任務并把渲染結果返回給客戶端。鑒于所有的渲染工作全在云端完成,本地既不需要裝備大量的圖形工作站,也不需要具備高性能的計算功能。隨著計算機配備更快運算速度的微處理器、更大容量的內存、更高傳輸率的網絡帶寬、功能更加完備的應用軟件,服務器端因而能夠實現更快速的計算功能并為客戶端提供更多更強大的服務。
本文將主要介紹在服務器端進行三維渲染的相關技術,包括系統框架、視頻流的壓縮和編碼等,并對服務器端的三維渲染技術的應用前景即云游戲部分進行了初探。
文章具體安排如下:第二章介紹三維渲染的不同方式,第三章著重介紹基于服務器端的三維渲染方法的系統框架和視頻壓縮的一些改進技術,云游戲的相關內容將在第四章作簡要介紹,最后一章對全文做總結并結合當下的一些問題提出展望。
Martin等人[3]根據渲染發生在客戶端還是服務器端將三維渲染分為基于客戶端的渲染、基于服務器端的渲染和基于混合端的渲染。
基于客戶端的渲染方法是服務器端僅向客戶端提供三維場景的描述信息,如模型數據、幾何紋理等,具體的渲染流程在客戶端執行。若讓服務器執行所有的算法以及渲染,只把計算的結果或者呈現的圖像壓縮后傳遞給客戶端則是基于服務器的渲染方法。而基于混合端的渲染方法即是讓客戶端和服務器端主機同時承擔一部分渲染工作量,最終渲染的圖像將在客戶端合并呈現。我們從渲染發生端、服務器和客戶端的通信、客戶端的硬件需求、方法的優劣等角度對這三種渲染方式做表1比較。
從表1中可以看出,基于服務器端的渲染方法將渲染的工作放在了服務器端上,僅把計算的最終結果傳至客戶端呈現。這種方法讓客戶端脫離了繁重的渲染壓力,渲染質量只和服務器有關,因而能夠給不同硬件設備的客戶端主機提供相同質量的渲染服務,客戶端不再需要考慮其軟硬件兼容的情況,只需在服務端安裝相應的應用程序即可。如果網絡通暢,可給不同平臺、不同硬件設備的客戶端主機提供無差別的、優質的渲染服務。可見,基于服務器端的渲染方法具有很明顯的優勢,也是當前主流的渲染方式。
使用服務器提供渲染服務是從渲染農場開始的。渲染農場最初是為了解決在動畫節目中需要花費大量時間用于渲染而提出來的一種分布式集群渲染系統。它利用通信協議將多臺計算機連接在一起構成一個計算機集群,以共同分擔一個原本需要由超級計算機才能完成的計算工作,因此能大大縮短渲染的時間。
渲染農場在實現中面對的最關鍵問題是:如何解決計算機集群中的負載均衡。從概念上來看,負載均衡是一種對計算任務的分攤和分配,它將一個計算任務分配給多個操作單元,由這些操作單元來共同執行完成。一些經典的服務器,如Web、FTP甚至是企業中的關鍵應用的服務器,都是采用這種方法。負載均衡以一種透明且便宜有效的方式拓展網絡和服務器帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性[4]。

表1 渲染方法比較
常見的渲染農場的管理軟件有Axceleon Enfuzion、PipelineFX Qube、Virtual Vertex Muster、Frantic Film Deadline,這幾款管理軟件的比較如表2所示。

表2 渲染農場的管理軟件比較
另外,Drqueue是一款完全免費的開源的管理軟件,直接內置了Python,可以通過Python腳本擴展功能,這對開發的公司來說是一個很大的誘惑,但是其更新緩慢,效率一般。其他的集群渲染管理軟件如Alfred、LSF、SPIDER、ROYALRENDER等,在國內應用比較少。
畫面渲染可以分為兩種:三維游戲中的實時渲染(Real-time Rendering)和動畫電影用到的離線渲染(Offline Rendering)。實時渲染為了保證玩家交互流暢而不得不在畫質上做出妥協,而離線渲染為了呈現高真實的畫質而不計成本。渲染農場就是一種離線的渲染方法。從誕生之日起,離線渲染就主要是為電影服務的,現在也一直如此。
RenderMan是一款經典的電影級的離線渲染體系,由PIXAR歷時8年做出,現已成為電影界渲染的一個規范。所有符合該規范的都可以被稱為是RenderMan兼容渲染器,最著名的是PhotorealisticRenderMan、BMRT、Entropy和3Delight。Photorealistic RenderMan(PRman)被稱為世界第一渲染器,采用最為原始的掃描線算法,但不支持光線跟蹤、全局照明和焦散效果。BMRT是一款免費的渲染器,由LarryGritz(Renderman大師)自己開發,支持光線跟蹤和全局照明,效果不亞于PRman,缺點是運行過慢。Entropy是BMRT的收費版本,運行速度方面要明顯優于BMRT,且支持各種光線跟蹤,渲染效果非常不錯,缺點是需要Mayaman和Maxman的配合使用。最普及的是3Delight,渲染速度快且渲染質量高,支持主流的渲染算法如光線跟蹤、全局照明、運動模糊等,具有很高的開放性和龐大的用戶群體,現已成為了RenderMan電影級別渲染器的主流。
實時渲染原本是為了游戲和提供實時的預覽而進行實時渲染的方法,它的本質就是圖形數據的實時計算和輸出,基本上都基于GPU圖形加速。當前許多游戲引擎使用的都是實時的渲染引擎,如著名的CryEngine、UnReal、Outerra等。離線渲染和實時渲染對比如下圖1和表3所示。

(a)離線渲染畫質

(b)實時渲染畫質圖1 離線渲染和實時渲染效果比較

離線渲染實時渲染處理器 CPU GPU渲染農場 傳統渲染農場 云渲染農場應用 電影 游戲特點 畫面質量高,真實感強;渲染時間長 畫面質量一般;渲染速度快渲染器 Renderman FurryBall
通過對比可見:離線渲染比實時渲染在細節上更深入,光照的效果更細膩,畫質的真實感更強。目前,傳統的離線渲染還不能利用基于服務期端的渲染方法提供實時交互,主要原因是:1.離線渲染本身一般進行的是高質量渲染,渲染一幀所需計算量大,花費時間長;2.用戶交互的即興性給服務器端的渲染工作施加了巨大的壓力,實時渲染的服務器端的渲染性能并不能在保證提供實時反饋的前提下亦保證畫面質量,只能有所取舍。當然,若今后GPU有重大變革的話,這種狀況或許會發生改變。
在CES 2009展會上,AMD第一次提出“云渲染”并利用一臺高配臺式機和一個Yukon筆記本分別作為云渲染的服務器和客戶端,演示了一個云渲染應用“AMD Fusion Render Cloud”。云渲染和云計算相似,它是將三維的應用程序放在遠程的服務器中渲染,而用戶終端通過網絡軟件或本地的三維程序點擊云渲染按鈕,訪問資源經由高速互聯網接入,用戶終端發出渲染指令給服務器端,服務器端會根據該渲染指令執行相應的渲染任務,并將渲染出的結果畫面通過網絡傳送至用戶終端中并顯示。云渲染的效果圖見圖2。


圖2 云渲染服務器效果
云渲染至今仍處于探索初期,其面臨的主要困難是:如何處理三維渲染任務對計算硬件的性能以及指令響應時間上提出的苛刻要求。一個云渲染系統每天需要處理成千上萬個用戶渲染請求,若要同時保證給所有用戶提供高清的(如1080p)渲染,后端的服務器系統需要承擔巨大的計算壓力,這就要求服務器具備驚人的圖形計算性能,否則無法滿足大量用戶同時渲染的請求。另一個關鍵是云渲染對網絡延遲控制嚴格,如果在客戶端運行三維游戲,則該游戲就要對用戶指令的響應具備高度敏感性,尤其在類似于CS的激烈對戰游戲中,稍有延遲就可能讓戰事陷入死局。因而延伸出了另一個困難:高清的渲染需要在網絡上傳遞大量的圖像數據,要讓三維渲染達到畫面流暢的效果,畫面的幀率就需要達到30fps,如果游戲的分辨率達到1920*1080,一般的傳輸碼率要高于10Mbps,這也給網絡負載提出了很高的挑戰。
為給客戶端提供及時的響應反饋,基于服務器端的渲染需要對延遲作嚴格控制。服務器端響應客戶端消息的流程是:用戶發起請求→服務器端接收請求→服務器端渲染圖像→服務器端壓縮圖像→壓縮的圖像經由網絡傳輸→客戶端接收后解壓縮→客戶端顯示圖像[5]。在既定的網絡傳輸能力下,如何快速地將渲染的圖像壓縮傳輸到客戶端是影響整個流水線時間的重要因素。因此,人們提出了很多視頻壓縮編碼的方法以加速服務器端的圖像/視頻流的壓縮速率和壓縮比率。
所謂視頻編碼是指通過特定的壓縮技術,將某個視頻格式的文件轉換成另一種視頻格式文件的方式,其目標是:在盡可能保證視覺效果的前提下減少視頻數據率[6]。當前主流的視頻壓縮編碼方法有:幀內壓縮和幀間壓縮。幀內壓縮在壓縮一幅圖像時僅考慮本幀的數據而不考慮相鄰幀之間的冗余信息,屬于一種自滿足式的壓縮方法,一般是采用有損壓縮算法,但其壓縮比率不高。幀間壓縮是一種無損的壓縮方法,利用的是相鄰幀之間的相關性。由于大多數視頻的相鄰幀之間的信息變化很少,對這些冗余信息進行壓縮,僅僅記錄本幀和其相鄰幀之間的差值就能得到很大的壓縮量。需要說明的是:“相鄰幀”指的是編碼關系上的相鄰而非實際播放順序上的相鄰。
運動補償是一種描述相鄰幀之間差別的方法:目標圖像會被分割成若干矩形像素塊,每個矩形塊中計算一個單獨的二維向量并存儲,該向量是該矩形塊的位置偏轉向量,即指示對應塊在參考幀中源數據的位置。尋找這些二維運動向量的方法被稱為運動估計。
變形是一種運動向量的方法,它主要用于傳統的基于運動補償的視頻編碼估算器。圖像變形的方法是每秒只生成少量的圖像,而中間的部分使用圖像變形實現。變形主要用于補償網絡延遲,并且在網絡寬帶允許的情況下,讓客戶端渲染器擁有比服務器端渲染器更高的幀率。Yoon建立的IBRAC系統就是基于這個方法[7]。應用上,Aliaga等人提出一種方法:利用圖像變形來處理攝像機捕獲的高密度畫面以實現對一個真實場景的漫游;這種方法利用空間圖像分層和基于模型的壓縮技術實現了在交互狀態下對任意道路的漫游和觀察。變形主要采用比較相似的圖像,以減少不必要信息的存儲[8]。然而,該方法不適用于預先不知道要壓縮的圖像是什么的交互式應用程序。Duan等人提出了一個有關深度圖的編碼算法[9],但這種方法對于渲染器中的重建過濾器來說會明顯放大一些原本很小的錯誤。
當前在視頻流的傳輸中,最重要的編解碼標準有國際電聯的H.261、H.263和H.264[6]。使用基于變形的運動估計的改進的x264編碼器能夠極大的改善輸入序列的質量,這種編碼器在基于服務器端的渲染中最為常用。相同的高質量的內容能夠以低碼率傳遞給用戶,這對用戶來說是很誘人的。其壓縮方法對CPU的開銷也很低,只需要對視頻編碼器做一些相對簡單的改動就可以實現。Giesen和Klein提出的方法著重于減輕服務器端的負載,關鍵想法是:使用附加信息以增加壓縮階段的運動估計流程[10]。所謂的附加信息包括外部的和內部的相機參數,以及每個像素的深度信息。在探索移動用戶的云游戲體驗上,Shi等人使用三維變形以輔助實時視頻方法的編碼,運用H.264/AVC編碼器,利用三維游戲引擎運行時的圖像渲染上下文,如渲染角度、像素深度、相機運動等信息來為云游戲服務,以增強其視頻編碼的性能[11]。
電子游戲市場在軟件和娛樂行業非常重要的。據估計,2019年全球游戲市場規模將達到1500億[12]鑒于云計算的基礎設施遍地開花,云游戲成為一個新的且極具發展前景的游戲種類。未來的游戲市場,將會被盒裝游戲、在線銷售游戲和云游戲三分天下。
OnLive首先提出了云游戲服務,云游戲服務要求在云端渲染三維游戲場景并把游戲場景以二維視頻的方式經由寬帶網絡傳輸到游戲玩家的瘦客戶端,游戲玩家的控制信息會傳至云端上以實現玩家和游戲應用程序的交互。云游戲的游戲程序的運行質量和客戶端無關,用戶不需要花錢更新硬件以支持最新的游戲;用戶可以在不同的平臺上運行相同的游戲;用戶可以不用考慮硬件開銷上嘗試更多的游戲。對于開發者來說,使用云游戲可以支持更多的平臺,不用考慮軟硬件兼容的問題,減少產品開銷,增加網絡收入。但云游戲需要高質量和低的反應延遲(例如第一人稱射擊類游戲需要大約100ms[13])。每個游戲的場景都需要經歷實時的視頻流水線:渲染、編碼、傳輸、解碼、展示。要設計出一款既能滿足這種嚴格的反應延遲需求又能達到高質量的視頻的云游戲是很難的。
Huang等人展示了一個完整的開放的云游戲系統——Gaming Anywhere[14],其具備很高的延展性、移植性和重構性。該云游戲可以運行在Windows、Linux和OSX系統上,而客戶端可以運行在其他的操作平臺上,包括iOS和Android。Gaming Anywhere和OnLive、Stream MyGame相比,前者具備良好的反應能力并能提供更好的視頻質量,它在減少網絡擁堵,減少反應延遲上都具有優勢。
本文對基于服務器端的三維渲染的相關應用程序和方法進行了探討,這些方法中,大多是將渲染程序放在服務器端,而服務器端將渲染的結果圖像壓縮后傳至客戶端。為了優化服務器端的服務質量,大多數的應用都力圖在服務器端實現硬件加速,在獲取結果圖像時直接從幀緩存中讀取數據再壓縮傳遞;在傳輸過程中,選擇傳輸整體或者部分的圖像數據,并使用改進的壓縮方法加快圖像的壓縮速率和壓縮比率以減少網絡中的數據傳輸量;在交互過程中,使用不同分辨率的渲染層級提供臨時的圖像預覽和最終的圖像展示過程。基于服務器端的渲染方式不再考慮不同客戶端的硬件差異,給應用程序的開發和低端移動設備的高質量顯示帶來了新的可能。基于服務器端渲染的比較熱門的應用——云游戲,雖然還處在研究初期,但未來或出現重大的突破,從而給終端機的各種應用帶來巨大變革。
隨著基于服務器端的渲染技術進一步發展以及云渲染的普及,在未來的客戶終端上,瘦客戶端或許會成為一種趨勢。在未來的某一段時間,計算機硬件的發展或許會進入一段停滯期,專門生產計算機硬件的廠商會有一部分轉入網絡相關領域,以提供更為流暢的網絡帶寬服務。
云計算的初衷是為了充分利用閑置的計算資源(不超過5%),但是隨著各地云渲染工作站無規劃的競爭大肆興起,計算資源的利用率反而下降,而且云端工作站的維護需要大量的資源消耗,若無雄厚的資金支撐和豐富的業務資源,一般很難堅持下去。所以,尋求新的運營模式也是當下亟待解決的一個問題。