日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity3D图形性能优化

發布時間:2024/9/30 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity3D图形性能优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

圖形性能優化

圖形開銷在哪里

游戲的圖形顯示部分主要消耗計算器的兩個系統:GPU和CPU。任何優化的第一規則都是查明性能瓶頸在哪里,因為優化GPU和優化CPU的策略常常是不同的(甚至常常是相互對立的——常常為了優化CPU而把它的一些工作交給GPU,反之亦然)。

典型的瓶頸和檢查方法:

GPU常常受限于填充率和存儲器帶寬。

如果游戲在較低的顯示分辨率上運行更快,則很可能是受限于GPU的填充率。

CPU常常受限于需要渲染的物品數量,我們通常叫它“drawcalls”(繪制調用,一般用專業術語“draw call”)

在Rendering Statistics窗口查看“drawcalls”,如果在PC上它常常多達幾千個,或者在移動設備上多達幾百個,那么你可能需要優化物體的數量。

當然,這只是根據經驗的主要開銷點,而瓶頸也可能在別處。不那么典型的瓶頸有:

GPU和CPU在渲染方面都沒有問題!比如,你的腳本或者物理可能是真正的問題所在,使用Unity的Profiler查明問題。

GPU處理太多的頂點。到底多少個頂點是ok的,依賴于具體的GPU設備和頂點著色器的復雜度。典型的數字是,在移動設備上“不要超過10萬個”,在PC上“不要超過數百萬個”。

CPU處理太多的頂點—— 針對CPU處理頂點的情況。這可能是蒙皮網格、衣服模擬、粒子等。

?

CPU優化:draw call數量???????????????????????????????????????????????????????????????????????????????????????????????????????

為了渲染一個物體到屏幕上,CPU需要做一些工作——比如,哪些燈光影響物體,建立著色器和著色器參數,給顯卡驅動發送繪制命令,然后準備發送給顯卡的命令。單個物體的CPU開銷并不昂貴,但是如果有很多可見物體,這些開銷會累加。

所以,舉例來說,比如你有1000個三角形,相比每個三角形一個獨立的網格,它們都在一個網格中對CPU開銷要低得多。這兩種方案對于GPU來說差別不大,但是CPU渲染1000個物體(代替1個)的開銷多很多。

為了讓CPU做更少的工作,減少可見對象的數量是很有效的:

合并接近的物體。可以手工合并,也可以利用Unity的drawcall batching(批量draw call)。

在物體中使用更少的材質。可以把獨立的紋理合并成一個更大的紋理圖集。

避免使用導致物體被渲染多次的效果(比如反射、陰影、像素光照等,見下面)。

合并物體使每個網格有至少幾百個三角形,并且整個網格只使用一種材質。合并兩個不共用同一材質的物體并不會提升性能,理解這一點很重要。擁有多個材質的最常見原因是兩個網格不共用相同的紋理,所以為了優化CPU性能,你要確保合并的物體共用相同的紋理。

然而,如果在正向渲染路徑下使用很多像素光照,有一些情況下合并物體并沒有效果,下面解釋。

GPU:優化模型幾何

有兩個優化模型幾何的基本原則:

不用使用任何非必要的多余三角形

盡可能減少UV貼圖接縫和硬邊(頂點增多了一倍)的數量。

注意,圖形硬件處理的頂點實際數量常常跟3D應用程序報告的不一致。建模應用常常顯示幾何頂點數量,即構成模型的不同角點的數量。然而,圖形顯卡為了渲染目的可能會把一些幾何頂點拆分成兩個或者更多個邏輯頂點。如果一個頂點有多個法線、UV坐標或者頂點顏色,那么必須把它拆分。因此,Unity中的頂點數量一定會比3D應用程序給的定點數多。

模型的幾何數量主要對GPU有意義,Unity中的一些特性也在CPU上處理模型,比如網格蒙皮。

光照性能

不需要計算的光照是最快的。使用光照貼圖烘焙靜態光,只需要一次,代替了每幀計算。生成光照貼圖環境,比在Unity的場景中放一個光源消耗的時間僅僅多一點,但是

1、它的運行速度要快很多(對于2個逐像素光照,快2-3倍)

2、并且,因為可以烘焙全局光照,并且lightmapper(光照貼圖工具)可以讓烘焙的結果更平滑,所以它看起來效果也好很多

許多情況下,有一些著色器和內容的簡單技巧,而不是在所有地方添加更多的光源。比如,為了獲得“邊緣光照”效果,可以直接在著色器中添加一次“邊緣光照”計算,而不是添加一個直射相機的燈。

?

正向渲染中的光照

對每一個受到影響的像素,逐像素動態光會累加可觀的渲染耗費,并且會導致物體在多個通道被渲染。在性能比較差的設備上,比如移動設備或者低端PC的GPU,避免使用多于一個的像素燈照射任何單個物體,并且使用光照貼圖來照亮靜態物體而不是每幀計算光照。逐頂點動態光照會在頂點轉換上累加客觀的消耗。努力避免多個燈光照射任何給定物體的情況。

如果你使用像素光照,對于每一個網格,像素光照射它多少次,它將被渲染多少次。如果你合并兩個相距較遠的網格,將會增大合并物體的有效大小。渲染的時候,照射到合并物體任一部位的所有的像素光都會被計算,所以,需要渲染通道數量會增加。一般地,渲染合并物體的通道數量等于分別渲染獨立物體的通道數量之和,所以,合并沒有作用。因此,你不應該合并足夠遠以至于受不同像素光影響的網格。

渲染的時候,Unity查找所有網格周圍所有的光,并計算哪一個對網格影響最大。Quality ?Settings(質量設置)可以修改最終多少個光是像素光,多少個是頂點光。每一個光基于距離網格的距離計算它的權重和光照強度。此外,取決于游戲內容,有些光比別的光更重要。因此,每個光源有渲染模式設置,可以把它設置為重要或者不重要,標記為不重要的光一般有更低的渲染開銷。

舉例來說,考慮一個賽車游戲,玩家的車開著車頭燈,在黑夜中行駛。車頭燈是游戲中最重要的可見光,所以它們的渲染模式可能要設置為重要。另一方面,可能游戲里的其它燈光沒那么重要(比如其它汽車的尾燈),對這些燈光來說,使用像素光照提升可視效果作用不大,可以把它們設置為不重要,避免在只能獲得較少效果的地方浪費渲染性能。

對于CPU和GPU來說,優化逐像素光照都可以減少開銷:CPU需要處理的draw call少了,GPU需要處理的頂點和光柵化所有這些額外對象的渲染的像素少了。

?

GPU:紋理壓縮和多重紋理

使用壓縮紋理會減少紋理大小(結果是更快的加載速度和更小的內存占用)并且大幅提高渲染性能。壓縮紋理占用的存儲帶寬只有未壓縮的32位RGBA紋理的一小部分。

使用多重紋理

作為經驗,在3D場景中使用的紋理總是啟用生成多重紋理。以同樣的方式,GPU渲染時,紋理壓縮可以幫助限制傳輸的紋理數據量,因為對于較小的三角形,多重紋理允許GPU使用較低分辨率的紋理。

這條規則的例外是,知道texel(紋理像素)是1:1映射到渲染的屏幕像素,比如UI元素或者在2D游戲中。

LOD(多細節層次)和每層剔除距離

在一些游戲中,為了減少CPU和GPU負擔,可以適當剔除小物體。比如,遠距離的小石頭和碎片可以設為不可見,而大的建筑物是可見的。

可以使用LOD系統,或者在相機上設置手工每層剔除距離,來做剔除。你可以把小物體放入一個獨立的層,然后使用Camera.layerCullDistance腳本函數設置每層的剔除距離。

?

實時陰影

實時陰影效果很好,但是會消耗很多的性能,包括CPU額外的drawcall和GPU額外的處理。更多細節,看文檔的陰影頁面

GPU:寫高性能著色器的提示

毫不夸張的說,高端PC和低端移動設備的GPU性能可能相差幾百倍,甚至在同一個平臺上也相差這么大。在PC上,一個快的GPU幾十倍速于低端集成GPU;在移動設備上,也是如此。

所以,請記住,在移動設備和低端PC上的GPU性能,可能比你的開發機器低得多。典型地,為了良好的性能,著色器需要手工優化來減少計算和紋理讀取。例如,一些內置的Unity著色器有快得多的等價的“移動”版本(但是有些限制或者是近似值 - 就是這些使得更快)。

下面是一些針對移動設備或者低端PC顯卡的指南:

?

復雜的數學運算

復雜的數學函數(比如pow、exp、log、cos、sin、tan等)開銷很大,所以一個好的經驗是不要在每個像素上使用這些函數。如果可以,考慮使用查找紋理作為替換。

不建議自己實現normalize、dot、inversesqrt等運算,使用內置的函數,驅動會生成更好的代碼。

記住,alpha測試(裁剪)操作會使你的片段更慢。

?

浮點運算

寫自定義的著色器時,應該指定浮點數精度。為了獲得更好的性能,選用最小的可行浮點數格式是很關鍵的。運算精度在很多臺式機GPU上完全被忽略,但是在移動設備GPU上,它對于性能很關鍵。

如果著色器是Cg/HLSL寫的,精度如下:

1、float?- 32位浮點數格式,適合用于頂點變換,但是性能最慢。

2、half?- 減半的16位浮點數格式,適合用于紋理UV坐標,性能大約是float的2倍。

3、fixed?- 10位頂點格式,適合用于顏色、光照計算和其它高性能操作,比float大約快4倍。

如果著色器用GLSL ES寫的,浮點數格式分別是:highp,?mediump,?lowp

了解著色器性能的更多細節,請閱讀文檔著色器性能頁面

讓你的游戲更快的簡要清單

如果目標設備是PC,保持頂點數低于20萬-300萬,依賴于目標GPU。

如果你使用內置著色器,選用Mobile或Unlit種類的。它們也可以在非移動平臺良好工作,是復雜著色器的簡化或者近似值版本。

1保持每次場景不同材質的數量—— 不同物體盡可能共享材質。

2對于不移動的物體,設置Static屬性,允許像靜態批處理這樣的內部優化。

3除非必要,不要使用像素光 —— 只選用一個(盡可能平行光)像素光影響你的幾何體。

4、?除非必要,不要使用動態光 —— 選擇烘焙光照來代替。

5如果可以,盡量使用壓縮紋理格式;否則,16位格式紋理性能好于32位的。

6除非必要,不要使用霧效果。

7學習遮擋剔除的好處,然后使用它來降低可見幾何體和有許多遮擋的復雜靜態場景drawcall的數量。設計你準備從遮擋剔除獲得好處的等級。

8使用天空盒“冒充”遠距離的幾何體。

9使用像素著色器或紋理合并來混合幾個紋理,而不是多通道逼近。

10、?如果寫自定義著色器,使用盡可能小的浮點數格式:

fixed?/?lowp?-用于顏色、光照信息和法線,

half?/?mediump?-用于紋理UV坐標,

float?/?highp?-避免在像素著色器中使用,用于頂點著色器的位置計算比較好。

11在像素著色器中,盡可能少用復雜的數學函數,比如pow、sin、cos等。

12每個片段使用較少的紋理。

?

總結

以上是生活随笔為你收集整理的Unity3D图形性能优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。