最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Unity3D性能優(yōu)化——渲染篇

2018-09-19 18:28 作者:皮皮關(guān)做游戲  | 我要投稿

作者:朔宇


本篇難度:★★★☆☆

大渣好,我又來了。

之前的文章中,我們了解了Profiler工具,以及在實際項目中unity的CPU優(yōu)化分析及方法,本文我們主要了解在我們的項目中GPU的性能分析,以及對GPU性能進行優(yōu)化的相關(guān)技術(shù)。


渲染優(yōu)化

在了解優(yōu)化渲染前,我們需要了解在unity中,每一幀的渲染CPU和GPU都做了些什么:

1)CPU檢查場景中每個對象,決定他們是否應(yīng)該被渲染。(這些對象只有滿足一定的條件才會被渲染。)

2)CPU收集即將被渲染的對象信息,并把這些信息分類為渲染指令(也就是draw calls,我們在之前的文章中也有提到,Draw Call實際上就是一個命令)。一個draw call包含網(wǎng)格數(shù)據(jù)以及網(wǎng)格如何被渲染。在某些場景,共享設(shè)置的一些對象可能會被合并為一個draw call。合并不同對象的數(shù)據(jù)到同一個draw call被稱作batching。

3)CPU給每個draw call創(chuàng)建一個數(shù)據(jù)包,稱為batch。每一個batch必須包含一個draw call。

4)CPU會發(fā)出指令,使GPU改變一些渲染狀態(tài)。這個指令被稱為SetPass call。SetPass call通知GPU,如何去渲染下一個網(wǎng)格。只有在渲染下一個網(wǎng)格時,其渲染狀態(tài)相對于渲染上一個網(wǎng)格發(fā)生了變化時,才會調(diào)用SetPass call。

5)CPU把draw call發(fā)送給GPU。draw call通知GPU使用最近的SetPass call去渲染指定的網(wǎng)格。

6)有時,batch可能需要不止一個的pass。pass是shader代碼的一部分,而新的pass需要改變渲染狀態(tài)。對于batch中的每個pass,CPU必須發(fā)送一個新的SetPass call然后必須要再次發(fā)送draw call。

7)GPU按照CPU發(fā)送的指令順序處理這些指令。

8)如果當前任務(wù)是SetPass call,那么GPU更新渲染狀態(tài)。

9)如果當前任務(wù)是draw call,那么GPU渲染網(wǎng)格。渲染網(wǎng)格發(fā)生在很多階段,不同階段的shader代碼可以定義渲染。其中:頂點著色器vertex shader告訴GPU怎么處理網(wǎng)格的頂點。片元著色器fragment shader告訴GPU怎么繪制單獨的像素。

10)以上過程會重復(fù)執(zhí)行,直到所有CPU發(fā)送的任務(wù)都被GPU完成。

理解渲染最重要的是:為了渲染一幀,CPU和GPU必須都完成他們的任務(wù)。他們中的任何一個花費了過長的時間去完成任務(wù),都會造成渲染延遲。渲染問題有兩個基本的原因。第一類問題是由低效的渲染管線引起。當渲染管線中一步或者多步花費了太長時間,打斷了平滑的數(shù)據(jù)流時,渲染管線會很低效。渲染管線的低效被稱為瓶頸。第二類問題是由于,渲染管線被塞入了太多的數(shù)據(jù)。即使是最高效的渲染管線,對于一幀中可以處理的數(shù)據(jù)量也是有限制的。?

渲染優(yōu)化的主要目的就是減少渲染的工作量,控制渲染的工作量是保證效率的根本,而每幀渲染的頂點數(shù)量是衡量渲染工作量最直觀的標準之一:

每幀可渲染的頂點數(shù)量主要取決于設(shè)備的CPU和GPU。 不過通常來說PC游戲每幀渲染的頂點個數(shù)不宜超過2M,移動游戲每幀渲染的頂點數(shù)量不宜超過0.1M。


CPU渲染優(yōu)化

  • 了解CPU和GPU的渲染工作后,我們再來了解Unity中具體優(yōu)化問題,當我們確定是性能問題是渲染所引起后,首先要確定是CPU限制還是GPU限制,不同的問題就需要不同的解決方案。

CPU限制:

  • 在渲染每一幀中CPU會完成三個任務(wù):確定繪制的物體 —> 為GPU準備命令 —> 發(fā)送命令給GPU。


  • 這些任務(wù)通過多線程完成。多線程允許不同的任務(wù)同時執(zhí)行;當一個線程執(zhí)行一個任務(wù)時,另一個線程可以同時執(zhí)行其他任務(wù)。這意味著工作能夠更快的完成。當渲染任務(wù)被分發(fā)到不同的線程時,稱為多線程渲染。


  • Unity渲染過程中和三類線程相關(guān):主線程,渲染線程和工作線程。主線程用于我們游戲的主要CPU任務(wù),包括一些渲染任務(wù)。渲染進程是專門用于發(fā)送命令給GPU的。每個工作線程執(zhí)行一個單獨的任務(wù),例如剔除和網(wǎng)格蒙皮。哪些任務(wù)執(zhí)行在哪個線程,取決于我們游戲運行的硬件和游戲的設(shè)置。例如,CPU的核心數(shù)量越多,就會生成越多的工作線程數(shù)。因此,在我們的目標硬件上進行性能分析是十分重要的。在不同的設(shè)備上,我們項目的表現(xiàn)可能相差很多。


  • 由于多線程渲染非常復(fù)雜并且依賴硬件,在我們嘗試改進性能時,必須首先找到是哪些任務(wù)導致了CPU問題(可以通過Profiler來檢查)。如果我們的游戲運行緩慢是因為在一個線程上剔除操作花費了太長的時間,那如果我們在另一個線程上降低發(fā)送給GPU命令的時間是不會有什么幫助的。


  • 發(fā)送命令到GPU花費時間過長是引起CPU限制的最常見的原因,其最耗時的操作是SetPass call。如果CPU限制是由發(fā)送命令到GPU引起的,那么降低SetPass的數(shù)量通常是最好的改善性能的方式。我們可以在Statistics窗口中觀察到其數(shù)量,如下圖所示:

  • 降低SetPass call和batches數(shù)量,我們通??梢詮囊韵聨讉€方面來進行:

  • 減少要渲染的對象數(shù)量,通??梢酝瑫r降低SetPass call和batches的數(shù)量。

  • 減少每個要渲染的對象的渲染次數(shù),通??梢越档蚐etPass call

  • 合并要渲染的對象的數(shù)據(jù),可以降低batches數(shù)量不同的技術(shù)適用于不同的項目,我們在項目開發(fā)中因該從項目本身需求出發(fā)來選擇最合適的方法。

我們下面列舉以上幾個方面具體的優(yōu)化方法及技術(shù)

減少要渲染的對象數(shù)量

1.手動減少場景中物體的數(shù)量

這是一個最直觀且有效的方法,比如在多人游戲中,我們可以減少可見玩家的數(shù)量,如果不影響游戲性和玩家體驗,那這是就是一個即方便又快捷的方法。


2.Occlusion Culling(遮擋剔除)

遮擋剔除的原理就是當一個物體被其他物體遮擋住,不在攝像機的可視范圍內(nèi)時不對其進行渲染。具體方法如下所示:
把所有物體選中,Inspector面板中的static下拉菜單中勾選Occlusion Static 和 Occludee Static。


在Window中選擇Occlusion Culling。

然后在Occlusion Culling面板中選擇Bake,并點擊右下角Bake按鈕


在bake后,我們可以對比遮擋剔除前后的差別
(遮擋剔除前)


(遮擋剔除后)

可以看到,在場景中被遮擋部分并沒有被渲染。

  • 在Occlusion bake中有三個參數(shù):
    Smallest Occluder:設(shè)置最小遮擋物的尺寸,當遮擋物的長度或者寬大于設(shè)定值時,該物體才能夠遮擋住后面的物體。?
    Smallest Hole:設(shè)置最小孔的尺寸,當穿過物體內(nèi)部的孔或者多個物體堆疊形成的孔的大小小于設(shè)定的值時,遮擋剔除烘焙將忽略該孔的存在。?
    Backface Threshold:設(shè)置背面移除閾值,用于優(yōu)化場景,當該值為100時,攝像機拍攝不到的背面信息也會完整保留;當該值較小時,系統(tǒng)將對背面信息進行優(yōu)化甚至去掉背景信息。

Occlusion Culling(遮擋剔除)是對于場景優(yōu)化最重要的技術(shù)之一,對于較大的場景一定要使用遮擋剔除,大場景中過多的繪制渲染會造成很大的性能損耗。

3.攝像機Clipping Planes

我們可以通過攝像機的Clipping Planes 的Far裁剪遠端,從而降低攝像機的繪制范圍,如同所示:


為了降低性能損耗同時保證游戲質(zhì)量,F(xiàn)ar的值應(yīng)該合理控制,不要造成不好的游戲體驗,或者我們可以用霧來掩蓋不被渲染的遠端。

減少渲染對象的渲染次數(shù)

在游戲中,實時的光照、陰影、反射可以極大的提升觀感,但這些操作需要耗費極高的性能。


1.Lightmap(光照貼圖)

Unity燈光默認是實時光照,也就是說物體在燈光下不同位置會產(chǎn)生不同燈光效果,由于動態(tài)光源在實時光照下會友大量的Setpass Calls,為了減小Setpass Calls,我們可以烘焙燈光效果,Unity會為我們生成光照貼圖,這樣大大減少了Setpass Calls。


為了了解光照貼圖,我們先新建一個項目


我們有五個點光源,在運行的時候可以看到Setpass Calls比較大。而我們的目的就是減少Setpass Calls。


首先我們把被光照到的物體勾選上Lightmap Static。


然后把所有光源的Mode設(shè)置為Baked

Realtime: 實時(默認)/ Baked: 烘焙 / Mixed: 混合


選擇window ——> Lighting ——> Settings


我們在Lighting設(shè)置面板中可以進行一些Lightmapping設(shè)置,這里我們點擊右下角的Generate Lighting,也可以勾選旁邊的Auto Genenrate(不建議勾選)然后開始生成光照貼圖,完成后會出現(xiàn)以下文件


并且可以看到Setpass Calls也從之前的23降到了8

Lightmapping更多的使用方法請參照Unity 官方文檔?這里只介紹基本的優(yōu)化相關(guān)


2.陰影

在unity中,陰影相關(guān)的優(yōu)化我們可以在質(zhì)量設(shè)置中進行


  1. )陰影 (Shadows):此項決定應(yīng)該使用哪種陰影類型。?
    硬陰影和軟陰影 (Hard and Soft Shadows):硬陰影和軟陰影都將得到渲染。
    僅硬陰影 (Hard Shadows Only):僅硬陰影 (hard shadows) 將得到渲染。
    禁用陰影 (Disable Shadows):沒有陰影會被渲染。

  2. )陰影分辨率 (Shadow resolution):陰影可以按以下幾種不同分辨率進行渲染: 低 (Low) 、中 (Medium) 、高 (High) 和很高 (Very High)。分辨率越高,處理開銷就越大。

  3. )陰影投射 (Shadow Projection):從平行光源投射陰影有兩種方法。緊密配合 (Close Fit) 渲染分辨率更高的陰影,但是如果攝影機移動,這些陰影有時就會有些許搖晃。穩(wěn)定配合 (Stable Fit) 渲染分辨率更低的陰影,而陰影不會隨攝影機的移動而搖晃。

  4. )陰影距離 (Shadow Distance):從攝影機處可以看見陰影的最大距離。超出此距離的陰影將不會被渲染。

  5. )陰影層疊 (Shadow Cascades):陰影層疊 (shadow cascades) 數(shù)可設(shè)置為零、二或四。層疊數(shù)越高質(zhì)量越好,但這要以處理開銷為代價。


3.反射探頭

反射探頭沒有很好的優(yōu)化方法,在我們實際的項目中卻常會用到,以創(chuàng)建更真實的反射,但卻會增加batches, 所以我們應(yīng)該在性能消耗較大的場合盡量最小化其使用率。

合并要渲染的對象的數(shù)據(jù)

  1. 動態(tài)批處理和靜態(tài)批處理

  • 在Unity中如果動態(tài)物體共用相同的材質(zhì),那么Unity會自動對這些物體進行批處理。動態(tài)批處理操作是自動完成的。在下面的兩幅圖中,我在場景里放入兩個物體,分別用同一材質(zhì)球和不同的材質(zhì)球,請注意Setpass Calls。


但同時我們注意CPU時間,同一材質(zhì)的CPU時間明顯更高,所以我們要注意增加的CPU時間是否會高于優(yōu)化節(jié)省的時間。

  • 我們進行靜態(tài)批處理時,其網(wǎng)格會合并,這也是進行靜態(tài)批處理的一個重要過程,我們需要他們使用同一個網(wǎng)格同一個材質(zhì)。靜態(tài)批處理沒動態(tài)批處理的諸多限制,且不會造成CPU損耗,但會有更高的內(nèi)存占用。
    使用靜態(tài)批處理時,只需要同一個材質(zhì)且批處理的物體處于靜態(tài),同時勾上Static。


可以從下圖看到,Setpass Calls同樣降低,且CPU時間也沒有增加。


2.紋理圖集

紋理圖集是把大量的小紋理合并為一張大的紋理圖的技術(shù),當我們使用這個技術(shù)為游戲創(chuàng)建美術(shù)資源時,我們可以確保物體共享同一圖集,因此適合合并。Unity內(nèi)置了圖集工具老版本為Sprite Packer,新版本為SpriteAtlas。具體使用方法如下圖。


GPU渲染優(yōu)化

  • 優(yōu)化GPU渲染問題主要從三個方面來進行,分別是頂點,填充,帶寬。我們需要明確這三個方面的概念。

1.頂點處理。頂點處理是指GPU需要渲染網(wǎng)格中每一個頂點的工作。
頂點處理的消耗受兩方面影響:必須渲染的頂點數(shù)量,以及在每個頂點上要進行的操作數(shù)量。

2.填充率。填充率是指GPU在屏幕上每秒可以渲染的像素數(shù)。如果我們的游戲受到填充率的限制,意味著我們的游戲每幀嘗試繪制的像素數(shù)量超過了GPU的處理能力。

3.顯存帶寬。顯存帶寬是指GPU讀寫其專用內(nèi)存的速度。如果我們的游戲速度受限于顯存帶寬,通??赡苁俏覀兪褂玫募y理太大,以至于GPU無法快速處理。

  • 對于GPU性能的優(yōu)化問題,我們可以通過Profiler分析,并關(guān)注GPU時間,來鎖定引起性能問題的原因,從而進行優(yōu)化。


對于GPU優(yōu)化問題我們主要可以通過下面幾個技術(shù)來進行

GPU渲染優(yōu)化中,我們常會進行一些shader的優(yōu)化,這部分內(nèi)容我希望放到后續(xù)shader相關(guān)的文章中,以便新手可以有更清晰的概念。


1.紋理壓縮

紋理壓縮技術(shù)可以同時極大的降低紋理在磁盤和內(nèi)存中的大小。如果是顯存帶寬的問題,那么使用紋理壓縮減小紋理在內(nèi)存的大小可以幫助改善性能,Unity提供了很多紋理壓縮的格式和設(shè)置,運用也十分簡單,根據(jù)不同的需求、機器和場景我們使用的方式也有所不同,具體可以參照Unity 官方文檔


2.Mipmap

如果我們的場景包含距離攝像機很遠的物體,我們可以通過使用miapmap來緩解顯存帶寬的問題,mipmap的主要作用便是模型的貼圖會根據(jù)攝像機距離模型的遠近而調(diào)整不同質(zhì)量的貼圖顯示,以達到優(yōu)化目的。其用法如下圖所示


注意這張圖片的大?。ㄓ蚁陆牵?br/>選中Generate Mip maps,點擊Apply確定


這里可以發(fā)現(xiàn)圖片大小發(fā)生了變化,這是因為我們使用MipMap技術(shù)之后,會對此貼圖生成八張精度質(zhì)量不同的貼圖,所以內(nèi)存占用變大。

下圖中兩個物體其一沒有設(shè)置mipmap,我們來查看發(fā)生了什么變化


很明顯,左邊沒有設(shè)置mipmap的物體,即使攝像機拉遠,其清晰度也并沒有發(fā)生變化


3.LOD

LOD與Mipmap類似,根據(jù)距離的遠近使用不同精度模型,遠處選擇低精度的模型,近的時候選擇高精度模型,這樣就可以減少模型上面的頂點和面片數(shù)量從而提高性能。
其和Mipmap的差異主要在一Mipmap針對貼圖,而LOD針對模型。Mipmap可以自動生成八張精度不同的貼圖,而LOD必須由我們自己提供三個不同精度的模型。
我們來了解一下LOD的用法,首先需要三個相同的模型,但是這三個模型他們的三角面和頂點數(shù)都不同,這樣就可以代表三種從高—中—低的層級(這里我使用粒子來代替, 分別用rate 50-20-5)


在TestLOD中添加組件LOD Group


在LOD Group中,我們把對應(yīng)百分比可見度的物體添加到進去


接下來我們看運行時的效果及性能分析

可以看到隨著攝像機位置的移動,我們的粒子會發(fā)生大、中、小三種變化(如果我們使用三種精度的模型,同樣,隨著攝像機的位置改變,模型的精度也就會發(fā)生變化。那么可想而知,性能損耗也就會發(fā)生改變)

  • 以上,就是我們在unity中對渲染進行優(yōu)化的簡單介紹和部分常用技術(shù)的學習。


    OK,本文到這里就宣告一個段落,在之后的文章中我們也會相應(yīng)的帶入其他性能優(yōu)化方法。這里作一個預(yù)告,下一篇文章中,我們會主要講解shader相關(guān)的內(nèi)容。


想系統(tǒng)學習游戲開發(fā)的童鞋,歡迎訪問?http://levelpp.com/? ?????

游戲開發(fā)攪基QQ群:869551769????????

微信公眾號:皮皮關(guān)

Unity3D性能優(yōu)化——渲染篇的評論 (共 條)

分享到微博請遵守國家法律
师宗县| 田林县| 安龙县| 喜德县| 乡宁县| 海阳市| 若尔盖县| 永寿县| 维西| 红桥区| 河间市| 襄汾县| 绍兴县| 孟州市| 嘉义县| 工布江达县| 鸡泽县| 兴海县| 仁布县| 腾冲县| 双柏县| 依安县| 海兴县| 涞源县| 泾源县| 宁明县| 宁强县| 大新县| 香河县| 罗江县| 泗水县| 泾阳县| 会同县| 洛扎县| 平邑县| 淮滨县| 尼木县| 法库县| 衡东县| 璧山县| 藁城市|