TGDC|騰訊劉冰嘯:《天涯明月刀》手游高畫質的技術實現

GameLook報道/2020年12月7日- 10日,由騰訊游戲學院舉辦的第四屆騰訊游戲開發者大會(Tencent Game Developers Conference,簡稱TGDC)在線上舉行。

TGDC自 2017年創辦以來,一直堅持以開發者視角與需求為出發點,結合行業發展趨勢,對大會內容進行不斷升級和擴充,旨在為國內外游戲專業人士打造開放的交流分享平臺,推動游戲行業良性發展、探索游戲更多可能。

在第二日(12月8日)的活動中,來自騰訊互動娛樂《天涯明月刀》手游引擎技術負責人劉冰嘯在演講當中,總結了在《天涯明月刀》手游的開發歷程中,幾項關鍵點的技術決策和開發的經歷,包括技術測試和應用,以及這些先進技術是如何落地的,為我們揭開了《天涯明月刀》手游高品質背后的秘密。

以下是演講實錄:

劉冰嘯:大家好,我是劉冰嘯,我來自騰訊《天涯明月刀》手游項目組,目前在擔任手游引擎的技術負責人。這次演講將給大家帶來《天涯明月刀》手游的開發歷程,包括其中幾項關鍵點的技術決策和開發的經歷。

《天涯明月刀》手游是一款基于真實的物理渲染的國風MMORPG游戲,它延續了天刀端游的畫面表現力,在手游平臺性能受限的環境下,達到了這樣的效果,甚至超越了端游的表現。這可不是簡單的畫面移植,背后的一切是怎么發生的呢?我作為天刀手游引擎技術負責人,將給大家帶來背后的開發歷程。

我們將要看一下天刀手游的先進技術,是如何在天刀里面落地的。

我們去考慮手游引擎開發的幾個重要要素:首先就是畫質,畫質我們需要進行一些選擇,是希望它突出遠景,還是希望它突出近景;畫面的表現上是優先于室內,還是優先于室外;整個畫面效果是鮮艷,還是更加自然;在光與影之間是做取舍,是優先光線的表達,還是優先影子的效果。

第二是幀率,對于天刀手游這種,屬于強交互的MMORPG的動作類游戲,我們需要一個高而且卻穩定的幀率。通常在PC開發的時候,我們只需要顧慮到兩個方面,先達成畫質的效果表現之后,通過優化來不斷地提高游戲的幀率;我們幀率達成一個目標點之后,再想辦法引入更好的畫質的表現。兩者產生不停的迭代,來提升整體畫面的效果和優化表現。

而對于手游來說,我們引入了第三個維度需要考慮的問題,那就是功耗。功耗對于手機而言,是非常重要的一個維度,它不僅會產生發熱,而且還會影響到玩家游玩的單次時間。

在這三個維度上,對其中任何一個維度的增加,都會影響到其他另外兩個維度的表達。

對于天刀手游的優化來說,我們開發引擎組采用了各種各樣的技術棧,從而獲取更好的優化效果。我們對多線程渲染引擎進行優化,把大部分可以并行的工作,比如動畫、布料,都放到其他的線程中去運行。我們使用了ISPC來自動生成NeonSIMD的代碼,這部分代碼可以更好地提升CPU的執行效率。

同樣在GPU和CPU的遮擋剔除中,我們使用了不同粒度的遮擋剔除算法,首先啟用了Vulkan API ,然后通過Vulkan API來對GPU的內存 ,進行更好的粒度上的管理。我們還實現了GPU driven的渲染管線,用compute進行輔助優化各項其他的渲染技術。

在畫面上,我們使用了PBR的材質,以及真實的物理單位的lighting,從而獲得更好的、真實的 HDR的畫面效果。

隨著手游的每次測試,我們都會加入一個重要的優化或者功能。在第一次測試中,我們對Unity 進行了多線程的框架改動,把渲染線程和提交線程從主線程中剝離出來,因為在手游的開發環境里,一個主要線程的持續工作會帶來手機芯片的功率提升,而它的功率提升則會帶來更多的發熱。

在第二測試中,我們引入了Vulkan API ,Vulkan API相對于GLES而言,有著更好的更輕量級的調用,經過測試,我們可以做到在提交線程上,獲得30%的CPU的效率提升。因為Vulkan API是更加自由的開發方式,你可以在其中進行各種各樣的優化,例如我們對一些比較重的 Vulkan API操作,例如Descriptor Set的綁定、layout的綁定,我們都可以采用一些Cache的方式來去做,這么靈活的Vulkan API,使得我們在做開發的時候可以獲得更好的解法。

在第三測試中,我們引入了GPU Driven的技術,通過GPU Driven技術,我們可以把大部分CPU上的工作,轉移到GPU上去運行。這不僅提升了GPU的效率,也減少了從GPU到CPU之間的 各種傳遞的帶寬。我們將這項技術里面用在了游戲內部的地形、草和植被上,包括在家園里面也運用了這些效果。

在第三次測試里面,我們修改并提升了游戲整體的光照表達,引入了自動曝光,提升了Tonemapping的效果,解決了由于真實物理單位引入之后,在不同的光照環境下,lighting體現的一些細節顏色丟失的問題;我們重新對sky lighting進行了定義,使得整個場景的室外表現
更加豐富并且具有對比度。

時間有限,在這里我主要講一下,在第三次測試中我們采用GPU Driven技術,來對渲染技術進行優化的一些要點。在開發的過程中,我們經歷了多線程的優化,同時也發現了在做手機平臺的一個優化的甜區。

其實手機的多核,要比在端游時代開發的時候,更早進入了多核時代,現在安卓手機很多都是四加四的多核架構,這有點像我們能夠在上一代的主機平臺上看到的形式,例如xbox360或者ps3 ,在這些架構下,都能夠讓開發者更多地使用這些輔助的計算單元,來提升你的計算效率。

對于引擎組來講,我們采用了兩個方向:第一個方向是盡可能地剝離主線程上的計算,通過dispatch到小核上、dispatch到其他線程上,來提升它的計算效率;第二個方向就是把計算轉入GPU compute。

為什么說GPU compute如此重要呢?首先我認為它是現代渲染框架的一個基石,大家都了解除了GPU進行光柵化處理的部分之外,compute能夠完成大量的GPU的渲染流程上的操作,包括計算光照、計算材質等等;另外一個值得注意的是,compute的渲染語言其實完全能和GPU的硬件對應起來,例如里面的Local Data Storage機制、ThreadGroup和Thread利用率的概念,這兩個都能很好地在compute語言上表現出來。

第二點是因為使用compute能夠發揮Vulkan更大的潛力。因為Vulkan本身可以對GPU的同步行為做出非常好的控制,而compute作為一個獨立的單元,我們可以把compute計算,很好的和GPU的其他計算并行起來,例如compute可以和一個帶寬優先的,比如shadow pass,進行并行;另外compute是一個單獨的Queue,我們可以對比vs和ps的整套pipeline來說,它是一個非常簡化的單元,是非常容易到處去擺放的。

第三點采用compute的話,可以給GPU Driven和Bindless打開更廣闊的優化空間,甚至可以使用Async compute方式。來更進一步的并行compute和GPU的單元。

對于天刀手游來說,打開compute的關鍵突破點就是GPU Driven的地形系統。

我們來看一下使用compute作為GPU Driven的一些研究方向。在最近的幾年里,GPU Driven其實是一個相對來說比較熱門的研發方向,在SIGGRAPH 15上,育碧有一篇文章《GPU Driven的渲染管線》(GPU-Driven rendering pipelines),主要是講《刺客信條:大革命》的開發。在2016年的GDC上,EA的寒霜引擎也提到了GPU Driven的pipeline,2018年FarCry5也實現了相關的功能,2019年育碧的機動車Fusion 也完成了相關的一些功能。但是在手機的領域上目前還沒有相關技術,能夠真正的在在線產品中體現出來。

那我們講一下什么是GPU驅動的渲染管線?

首先GPU掌握實際的渲染控制。GPU掌握渲染控制可以提供更細致的渲染力度,例如在做渲染剔除的時候,CPU只能控制在object level,使用Object Bounding幫助下做剔除;在GPU這個層面上,我們可以做到更進一步的控制,可以在Mesh cluster級別上,通過切分Mesh來獲得更好的力度控制。

它的另外一個好處是,它不需要GPU和CPU之間的數據來回傳遞,在理想情況下,GPU Driven甚至都可以使用一個Drawcall 來繪制完整個場景。當然了這個需要compute shader,以及indirect drawing相關API的支持。這些在Vulkan 1.0的情況下,我們是都可以拿到相關的支持的。

我們看一下,在天刀手游里面,GPU地形實施之后的結果。首先我們介紹一下CPU地形常用的算法,我們上一個版本里面的地形算法是CPU端的Geometry Clipmap算法,它采用的裁剪剔除方式是視錐的裁剪剔除方式,對比GPU Driven,它少了depth剔除,它計算LOD的方式是根據距離,而GPU Driven是可以根據距離以及地形塊的復雜度來計算。

送入clipmap方式的頂點處,因為有兩個pass,其中一個是要通過Virtual Texture來使用,在這種條件下,Geometry Clipmap算法處理后,渲染需要21萬乘2的頂點數,而在GPU Driven情況下,因為獲得了比較好的剔除效果,它只需要8萬6的頂點數。

最后看一下GPU時間,在GPU Driven的情況下,我們在iPhone8P上,可以獲得2.9毫秒的時間開銷,這比通過CPU的方式下,節省了近四分之一的成本;而在CPU端獲得收益更大,提交線程和渲染線程,每個都可以獲得五毫秒以上的收益。

GPU Driven的流程主要包含GPU Driven和Virtual Texture兩個算法 ,這兩個算法的實現是有互相的交叉,出于簡化我們只講GPU Driven相關流程上的一些算法。

首先是深度的mips生成。這部分算法是在compute里面實現的,其次我們是在compute里實現GPU遮擋剔除,使用上一步制作的深度緩沖buffer。GPU的遮擋剔除主要是通過計算送入的patches的尺寸,看它處在哪一級的深度緩沖上,并對比這一級深度緩沖的深度和你的深度,來決定是否被depth剔除掉。通過這個流程我們可以獲得可視的patches數目,根據可視的patches數目,通過compute來做indirect的Arguments的buffer,從而生成出來。

第四步就是把這些準備好的indirect buffer給繪制出來。這個就是整個地形使用GPU Driven的渲染流程。

在這里面有一個非常重要的優化,也在compute上是可以達成的,這個優化主要是利用compute里面的一個Thread shared memory的方式來做,它減少了對于CPU到GPU之間的多次的dispatch、減少了binding memory pingpong操作,在IMD的一篇文章里面也展示了這種優化更好的效果。它能應用的范圍主要在于對你的buffer做filter,例如我們經常在渲染管線中提到的Bloom、高斯模糊、自動曝光等,這些對于區域進行filter的操作,都可以采用這些方法來獲得優化。

我們看一下它怎么應用在天刀手游的地形體系里。首先我們會做第一次的dispatch,這個dispatch會產生16乘以16的線程組,每組128條線程,這128條線程讀入深度,放入mips 里;第二步通過同步的方式,再把上一級的mips相鄰的四個點取出來,合并選擇最深的單位,寫到第二級的mips里;然后依次類推 完成四級的寫出。在第二個dispatch里,我們用同樣的方法,dispatch一個線程組,128條線程,同樣地把后面 32乘16的mips寫入完成。

在GPU Driven的地形系統里面,我們仍然有另外一個機制的優化,這個機制是LOD體系。在Farcry的實現,主要采用的是CPU 四叉樹的方式,來組織LOD的patches,根據相機的距離更新并選擇CPU四叉樹上的節點,送入GPU進行indirect buffer和GPU Culling。

而對于天刀手游來說,我們會把這些patch信息,先通過offline的方式bake出來,在每一個相機發生位置變化的時候,會去更新這些bake出來的信息,根據這些信息,再會去對改變的patch做過濾,生成新的indirect buffer。

我們看一下差異:首先第一步我們讀到了所有的patches的屬性;第二步我們根據視錐裁剪,獲得視錐裁剪之后的結果;第三步我們再用HiZ產生的depth,產生一次depth裁剪。在完成這三步之后我們就可以生成Indirect Draw Arguments的buffer,然后 dispatch出去。

在我們完成GPU Driven的形成之后,引擎組會把這些所有的流程重新梳理一遍,再根據這些梳理出來的流程,去選擇可以應用GPU Driven的其他渲染模塊。其中比較重要的一個渲染模塊,就是場景的植被管理。其實有經驗的渲染程序可能直接會意識到這一點,其實草的geometry和地形的patch,或者是sector的管理是一個非常類似的概念,它們都有LOD,都有不同的geometry的表現。

我們繪制這些geometry LOD的時候最好的方法是通過Multi Draw Instanced Indirect的方案去做,另外一點是每種類型的草的Texture,它其實對應在地形上,更像是一個地形的Virtual Texture機制,也可以用bindless的方式去做綁定,可是在Vulkan 1.0的平臺下,我們這兩個API ,Multi Draw Instanced Indirect或者是bindless都沒辦法獲得更好的支持。所以在天刀手游的實現里,我們只能采用將草的每種類型,完成一次GPU Driven的culling和Draw Indirect Buffer的生成的方式。

另外在天刀手游里,比較適合GPU Driven的場景是家園的渲染。家園的玩法在游戲里面,主要是可以讓玩家盡可能多的定制我們整個家園的地形、地表、墻壁、物件、地板等,在這個層面上,其實它是需求非常多的geometry類型。

第二它的區域相對來說比較小,它只有128米乘128米的自定義空間,而在這種小的自定義空間情況下,遮擋剔除是必須要做的非常好的一種技術。

從這兩點來看,GPU Driven是非常適合應用在家園渲染的情況,問題就在于,家園里面的這些物件,其實和草的類型一樣,它都非常是依賴于Multi Draw Instanced Indirect和bindless這兩種API的實現。對于天刀手游來說,我們只能退而求其次,我們利用地形步驟算出來的HiZ的buffer做遮擋剔除,送入一套做遮擋剔除buffer的內容,然后通過CPU從readback的方案,來獲得這些buff er的遮擋剔除的結果,在CPU端組織盡量多的instance對象。即便采用這種方式,我們在家園渲染情況下也獲得了比較好的渲染效率。

在完成了compute的基礎機制上,我們在其上面也做了各種其他的嘗試,其中有一條是完成了在ASTC和PVRTC的GPU實時壓縮,這個也是通過GPU compute來實現的,這個功能可以用在角色的妝容系統上。在天刀手游里,整個角色的妝容系統是需要完成多個Feature的繪制,如果不能很好地去做baking到一張貼圖上,在實時渲染的情況下,它會產生更多的開銷。

在實時baking到貼圖上,我們還希望它能夠盡量去做壓縮,來減少內存的使用。我們測試了一些compute compression的效果,在PSNR和效率上都能獲得比較好的表現。

另外一個我們嘗試的對于VirtualTexture的壓縮。前面提到地形的VirtualTexture技術是需要更新大量的地形塊數據,越多的地形塊數據,才能使更新的頻率變低。在天刀手游里,我們使用2048乘2048,三張不經壓縮的材質,我們通過調整貼圖的大小和貼圖數量以及壓縮方式,基本上能把大張貼圖的時間控制在四毫秒以下,這個時間其實已經可以達到使用的效果。從遠處來看,其實地表材質是很難觀察到差異性,這是壓縮前后的兩張對比:

但是這種算法,我們對比了一下它的細節表現,仍然可以看到在開啟壓縮的情況下,它其實是有一些Blocking的瑕疵,但這樣的瑕疵在我們游戲的畫面品質情況下,是不能接受的,所以這種方案最終只能把它放棄。

另外一個compute應用的領域,我們嘗試了Cluster deferred。Cluster deferred主要應用于家園室內場景,在家園的室內場景下,主要的因素是,首先它是一個封閉的空間,它仍然和之前家園的環境一樣有大量動態的物體和光照效果。我們在這幅圖上可以看到,家園物體里面有大概55盞燈,從左上角的一張藍色的背景圖來看,這個區域上最多的話,可以被8盞燈以上的照亮。

在這個技術方案實現之后,我們發現它仍然解決不了幾個問題:第一個問題就是deferred本身的固有問題,它的帶寬問題,它需要設計更好的GBuffer擱置,也需要去應用一些API ,例如subpass ,或者一些更好的pass combine的操作 ;第二是在于它材質的復雜度,一個deferred的材質和forward材質,在整個大世界的使用是很難做兼容融合的,這個也增大了shader的復雜度或者工作量,這種方向也許對未來是一個比較好的技術點,但是在現有的架構下,我認為它還是不夠成熟,所以這套方案我們仍然是放棄了。

回到整個話題,我們從應用compute技術來看技術落地的情況。
我認為有幾個決策是非常重要的:第一是需要有一個非常好的基礎,這個基礎就來源于我們在于從多線程開始,就意識到整個計算體系應該去往不同的compute方向,或者是往其他線程方向去使用,通過減少主線程的開銷成本,來去提升整個游戲的性能效率。

我們讓有比較好技術功底的同事完成了GPU Driven地形的突破。在這個基礎之上,繼續使用GPU Driven的技術。解決了一些場景植被和家園的渲染效率問題,我們compute還解決了像自動曝光等等相關的問題。

第三點則是在于技術落地和產品需求之間的要求,有很多產品技術可能是比較先進,但是它不能達到產品需求的質量品質,我們對于這種技術也只能忍痛割愛。

接下來是Q&A環節,我已經收到了一些小伙伴們,提過來的問題,我將會選擇幾個作答。

其中一個小伙伴提出性能優化時有什么技術難點,聽說你們能以更低的規格實現更高標準,是怎么做到的?

問題非常有意義,其實我們在實現的過程中,沒有特別去顧慮高規格和所謂的低規格,我們一般是設定一個標準,在這個標準之上再去找平衡。舉個例子,對于我前面提到的光照或者是陰影的表達,我們認為陰影的表達是弱于光照效果的,所以我們仍然采用了比較傳統的lightmap 來bake shadow的方式,我們并沒有在大世界里面使用實時的陰影。所以我覺得這更像是一個平衡的問題,要基于你的游戲本身去承受的技術點,優先選擇面,最終找到一個適合游戲要求的技術。

第二個問題是我想了解的是像這類的經典IP,從端游移植到手游,從引擎技術角度,如何更好地還原端游品質?

這個問題我覺得可能要從兩方面來去回答,第一方面是說我們需要去還原端游的哪些特點,這個特點其實對于我們《天涯明月刀》而言,還是非常明顯的:第一要更加注重遠景的表現;第二我們要有更好的角色的表現。我們有些特定的技術點,的確也做到了比較好的還原,例如說云海效果。

基于以上的這些,我先要明確從端游還原到手游上的一些畫面技術點,然后去制定它的關鍵的技術要素,例如說《天涯明月刀》手游仍然延續了端游的PBR的管線,但是我們其實是使用了比端游更好的,基于物理光照單位的lighting的方式,這樣的話會使我們手游在暗光情況下的表現,甚至在某種程度上是優于端游的表現的。

我想這其實應該可以回答上面的一個問題了吧。以上就是我今天的所有的分享環節,謝謝大家的支持,也希望大家繼續支持我們的游戲,同時有機會和大家更多的交流,謝謝大家!再見。

 

如若轉載,請注明出處:http://www.hongkong333.com/2020/12/407368

關注微信
韩国和日本免费不卡在线a_有码av高清电视免费观看_国产国语对白露脸正在播放