為什麼遊戲引擎要渲染那麼多內容還是能到 60fps?
做了什麼神奇的優化?
從簡單的說,「渲染多內容」的優化主要方法是剔除(culling)和細緻程度(level of detail, LOD)。不在視角範圍的物體可剔除、被其他物體遮擋的物體可剔除、佔據屏幕面積太小的物體可(有損地)剔除。LOD 則是(有損地)縮減較遠距離的物體表示方式,除了減面,可用較簡單的 shader,也可換成 billboard/imposter 等。
還有一些要改變渲染器的架構。詳情請看RTR3 和 GEA。
渲染內容是很多,網上有gta5的渲染講解,那叫一個複雜。不過這些計算都被精簡了很多,甚至直接用貼圖完成。遊戲畫面都是由面片組成的,只需要計算物體表面的效果即可,大大減少實際計算量,遠景或者背景渲染直接放棄計算,用模糊或者霧來遮蓋;地面或者山體都是簡單的光滑多面體,凹凸不平的表面實際上是加了一層法線貼圖和陰影貼圖,讓人從遠處觀看產生凹凸不平的視覺效果;樹葉都是一個簡單的面;光線跟蹤一般只計算一兩次反射,次表面光線基本用貼圖代替。綜上這些小伎倆能讓人覺得畫面不錯了,但是細看就經不起推敲。
PC上不說,把 GPU 和 CPU 懟上去總歸可以。
從「那麼多內容」的角度來看,主機上兩大瓶頸:GPU 處理三角形的能力(2 triangles per clock)和 CPU drawcall 壓力。
前者只靠以往的 culling 和 LOD(GPU culling 也好,CPU 軟光柵 culling 也好,各類 portal occlusion volume也好)已經力不從心,現在很多引擎在搞的就是通過 GPGPU 在走 graphics pipeline 之前把需要光柵化的三角形預先 cull 一遍,見:
Optimizing the Graphics Pipeline with Compute - Frostbite
http://advances.realtimerendering.com/s2015/aaltonenhaar_siggraph2015_combined_final_footer_220dpi.pptx
CPU 方面引擎主要優化就是在 drawcall 處理,支持 VK 的搞多線程 drawcall,不支持的搞多線程 deferred context。能弄到 GPU 上的盡量弄上去,比如 drawIndexedIndirect,比如 virtual texture (坑)。
今年的重返德軍里每幀3萬drawcall + 600萬三角形相當驚人,應該是做了類似處理,很期待今年 siggraph。
首先在現在的主機顯卡上,不管你怎麼優化,一個時鐘吐出一個三角形基本就是極限了(據說輸出全零坐標+by pass param cache可以一個時鐘吐兩個,但這麼做出了給顯卡打廣告我實在想不出有什麼用)。所以你是沒法"渲染很多內容的"。
但是不管場景多大,你的屏幕就那麼點,解析度也就那麼點,有了這兩個大前提,就有優化的空間了。
好三角形要用在刀刃上,所謂的"渲染很多內容",不如說是"從很多內容中選擇性渲染最需要渲染的內容"。就是因為計算能力夠。
計算能力夠的原因是因為如果不夠就不會加那麼多內容。
所以並不是為什麼加了那麼多內容還能到60fps,而是遊戲廠商剛剛好加了足夠多的內容並且保證它還有60fps。
如果做不到,就不能賣了,你當然也見不到。少數坑錢的除外。
優化就是「偷懶」啊……
比如能重複利用的就不要多次渲染……
替換公式,用更簡單的運算拿到相似效果……
人不容易感知的偷懶,LOD……
看不見的不渲染,剔除,SSAO(更合適的例子是SSR,屏幕空間反射,不是次表面散射那個)這種……
拿美術效果去掩蓋不精細的部分……
還有往時間維度上打主意的,根據時間積累做光線跟蹤/抗鋸齒……
還有棋盤格渲染之類的「從根本上」減少工作量的……
此外,機能也一直在「實打實」地提升啊……
應該是先確定渲染到60fps,然後再決定渲染到什麼程度吧。而不是先確定渲染效果,最後發現,哎,剛剛好是60pfs。
你可能不知道一些畫面渣得要死的國產遊戲比如軒轅劍,上了泰坦也跑不到30fps的
不渲染那麼多東西它大概能上天
主要功臣都得益於硬體速度的提升.優化反而並不是最主要的.除了"聖杯",圖形研究基本已到瓶頸,該想到的點子都想到了,能用數學方法簡化的都簡化了,不作死的正常代碼其實在現代硬體條件下都差不多.要想渲染效率有質的提升(還可以用更複雜演算法的渲染技術提升畫面效果)還得靠下一次浪潮,比如量子計算等硬體革命.
其實人類早就找到了真實渲染世界的辦法,這幾十年來在不斷的折中,損失少量的真實性來更快的計算.如果擁有無限的計算性,用接近世界真理的方式來渲染整個世界都沒問題.
所以換個角度,整個世界,甚至宇宙.那麼多動態的東西,規則(物理,化學)等.上帝或者其創造的規則程序(引擎?)從不會計算失誤.你看見真實世界穿模的現象嗎?感嘆神的力量.
--突然想到上古傳說的魔法其實就是"掛"?
用了一些culling、LOD等優化方法。
culling是根據遊戲的特性把攝像機拍不到的地方全部剔除掉,只渲染模型的一部分。
通過LOD引擎根據相機離模型的距離距離還調整模型、貼圖的細緻程度,離相機比較遠的地方你以為它是個模型,實際上它很可能只是個低模或靜態圖,因為離得遠,看上去和使用原品質沒什麼差別。
植被啊這些東西,特別是草,在很多遊戲里只是個紙片。
然後減少drawcall。
======
實際上遊戲引擎能渲染多少內容主要還是直接和當下主流的硬體水平掛鉤,算力高當然渲染的內容多而且可以60fps。
以上很多大牛都從渲染方面提到了優化方案。一個成功的遊戲除了渲染,程序和美術端的優化也至關重要。都用UE,一樣有的遊戲手機都能跑,有的連1080都跑不順流,不是?你看到的,都是遊戲想展示給你的而已,那些不是那麼有礙觀瞻的,肯定會有不同程度的各種簡化了。比如程序方面的各種顯隱,剪裁,不刷新,不計算策略。美術方面的各種規格差異化,實現方式擇優化,資源整合或拆分法等等,都是在大效果上,讓你不易覺察,但在性能上卻能大大起到優化作用的優化方式。前提有個靠譜的TA和不太犯二的美術,策劃組。
因為買不起電競屏
硬體渲染, GPU 是可以並行處理加速(試試把那些東西放在 CPU 軟體渲染上,那不卡到 0.001 fps 才有鬼)
軟體層面各類優化,例如各階段的剔除,LOD,聚合減少提交等這個問題能寫幾大本書的。
很多嗎?
你可以找個畫質「以假亂真」的沙盒類3A遊戲,截幾張圖,放大後看看遠處的細節,那個叫慘不忍睹。而且遊戲解析度比人眼極限低多了,試著調高解析度,你會眼看著幀數從60,跌到十幾,再到個位數。60幀夠嗎?完全不夠。其實人眼極限大概有200幀所以事實是——當前遊戲不管是畫質、清晰度還是幀數,都遠遠不如現實。遊戲畫面的內容,和現實比起來,實在是少的可憐。當今的顯卡性能,依然嚴重不足。
因為偷懶,比如地面和人物進不去的牆面,你要是開個穿牆卡個bug進去了,就會發現只渲染了你能看到的那一面,就這麼偷懶把資源省下來的
談fps不關聯顯卡的都是耍流氓
家用機的話因為是按照60幀來設計啊
推薦閱讀: