感覺最近觀察追蹤,多邊形或著說三角形數量逐漸失控,如果只是單純這些還好,但是這通常反應的了一些事實,製作者可能不清楚負荷究竟有多重和如何測量。
而由於這方面的知識對大多數人不易學習操作,也很難認知甚至真正理解到底有多重和難以解決。
一般而言隨著規模越來越大,GPU幾何管線轉換到像素管線會越來越難也低效率,這受到頂點數據排佈和實際渲染上的複雜來回訪問模式影響,極易受硬件實現上的高延遲影響,從而表現出低利用率。
頂點數據的專用訪問硬件被添加到前端到計算單元周圍,需要經過多個步驟才能成功組織並計算出想要的座標,並最終提供給像素片段,或著也能認為是一個暫時產生的一張張紋理,混合計算輸出最終畫面。
這基本上是目前最優的方法了。
整個流水線你可以簡化成幾何管線(又稱為世界空間管線,NV文件說法)、像素管線(又稱為屏幕空間管線,NV文見說法)
越前面越複雜難以並行,又可以為這些管線細分幾個步驟,幾何管線(圖元分配、頂點屬性獲取(VAF)、頂點著色器)而頂點著色器到像素著色氣或歸納於幾何的後部分,VPC(剔除單元)->RAS(光柵化器),而到像素管線則經由TMU獲取紋理和ROP寫入等最終輸出。
頂點著色器隨著版本改進逐步想達成替換頂點著色器各種限制,幾何著色器(DX10)、細分曲面著色器(DX11)、網格著色器(DX12),想要兼具高效與靈活。
________________
而現在除了VPC累死和RAS轉換不快,其實影響大概也就一些時間,而不管怎麼丟棄當大量頂點數據進入且必須計算的時候,就得至少付出80~90%在幾何管線的時間,是必須經過這些步驟到像素前的設置轉換,才進行一些所謂的硬件剔除的,才同時做所謂的世界空間到攝像機空間、屏幕空間轉換等等云云,所以大量的頂點數據基本上是壓垮現代GPU幾何效率的部分。
而如果你很好正規的製作資產,這些模型做得很好,大概每3個三角形對應2個頂點,做得比較好會接近每2個三角形對應1個頂點,你可以知道大概以三角形數量而言,約50~66%比例算出大致的頂點數量。
如果你完全不懂整個流程,不懂分割UV島這些,細碎亂分毫無規則感,甚至會導致頂點重複計算,從而導致頂點數量翻倍,從而嚴重加重渲染負荷。
______________
影響有多大?非常大!
因為你多個渲染步驟,本質上都是重複走上述的管線N次,也就是說你想算出一些效果就會走頂點到像素,下個步驟也是頂點到像素,N個步驟後結合成功輸出最終畫面。
而畫面中人物數量越高,呈現線性增長幾何負荷,但是不線性增長像素負荷,這是因為會取決於渲染面積,遠處的avatar佔據面積小,近處佔據面積大,甚至結合剔除機制省下一些不必要渲染的像素開銷,增長十幾倍幾何開銷也僅只會增長數倍像素開銷。
像素與分辨率呈正比,且大量相對同質好走訪數據,利用率普遍相對高利用率。
幾何如果是簡單的靜態mesh還好,如果你是蒙皮mesh需要變形,並行度就會受到限制難上升,盡管一些渲染步驟仍然能大幅提高利用率,但通常負荷非常沉重,提高利用率遠不如增加的負荷,會顯著降低幀數。
______________
大概怎麼估算負荷?
以大量蒙皮為例,大概約20%RAS利用率,30%多頂點VAF利用率瓶頸,同時也可能導致L2瓶頸,通常是VAF,但VAF極受單元數量甚至緩存系統,非常難以計算且動態,還受到許多導入模型設置等影響。
(利用率受前端數量影響也挺多,前端越多通常利用率越低甚至會崩跌(本質上是無法並行導致可以通過的數量有限,數量越多導致分得越多,從而呈現利用率過低))
大概估算方式是先算RAS,假設頂點負荷重-20~30%的幀數。
先取得GPU的前端數量,例如一張顯卡擁有5個前端(是個3060ti/4070ti),頻率在1.8Ghz/2.6Ghz,則計算如下...
可以得到理論值為9、13,利用率計算出約1.8GTri、2.6Gtri,而受到頂點數據很好-5%,但普遍20~30%,這裡取20%計算。
1.8*(1-0.2)=1.44Gtri
2.6*(1-0.2)=2.08Gtri
因為普遍使用toon shader,這裡使用輪廓。
假設150K tri 是活動且在攝像機內,計算完輪廓為300k tri。
直射光或稱主光燈時,僅計算一次,而大多數為了能在場景中表現動態的亮暗,和有效在法線產生二值化的toon shader上產生顯著效果,打上了像素燈光,導致通道(pass)增加。
而必須重複計算的結果,當使用一盞光源,導致重複計算完到600k tri,如果為兩盞燈(每盞燈範圍越大容易重複覆蓋,只要覆蓋到的模型部分就會導致重計算,這裡簡化成剛好模型所有網格被全部都照到)都照到計算到900k tri。
這裡設下標準,不開鏡子下直接看到這些所有avatar一共10個。
10*600k tri=6M
10*900k tri=9M
分別轉換單位計算,從上面1.44、2.08轉換到1440M、2080M。
可以得到大約240、347fps,在6M tri下。
或160、231fps,在9M tri下。
接下來假設幾何非常沉重,導致整體時間佔比剛好頂到一個極限左右,75%時間佔比(不詳細解釋原因,因為太長),其他部分被像素佔據,並且像素不更沉重的情況下。
分別得到180fps、260fps (6M)和120fps、173fps。
不考慮場景及其他更重負荷情況下的fps。如果你的顯卡僅是3060、6600XT之類等級,可能更低,例如以3060來說大概3個,雖然利用率更高些。
簡易估算大概*0.7(對於3060ti)->108fps(6M 1燈)、84fps (9M 2燈),你可以理解為什麼GPU負荷這麼高。
如果你開啟鏡子,利用率會稍微上升,並假設全部看見,負荷會增至原有1.8~1.9倍。
對於3060你會得到以下結果
57~60fps (6M tri 1燈),44~47fps (9M tri 2燈)
對於3060ti你會得到以下結果
95~100fps( 6M tri 1燈),63~67fps(9M tri 2燈)
對於4070ti你會得到以下結果
137~144fps(6M tri 1燈),91~96fps(9M tri 2燈)
如果你一次看到更多avatar,或燈光設計不合理密集或單燈過大範圍,負荷會更大,請將更多avatar盡可能優化,部分活動avatar超過25萬三角形不少算少有點離譜。
以上是大致的典型值,可供參考估算。
請勿使用在超過3060ti、4070ti以上規格前端的GPU,會導致計算不準確,結果會近似以上,等未來計算著色器替換頂點著色器以計算著色器蒙皮合批利用可以『近似』估算,雖然近似估算誤差大。
而由於這方面的知識對大多數人不易學習操作,也很難認知甚至真正理解到底有多重和難以解決。
一般而言隨著規模越來越大,GPU幾何管線轉換到像素管線會越來越難也低效率,這受到頂點數據排佈和實際渲染上的複雜來回訪問模式影響,極易受硬件實現上的高延遲影響,從而表現出低利用率。
頂點數據的專用訪問硬件被添加到前端到計算單元周圍,需要經過多個步驟才能成功組織並計算出想要的座標,並最終提供給像素片段,或著也能認為是一個暫時產生的一張張紋理,混合計算輸出最終畫面。
這基本上是目前最優的方法了。
整個流水線你可以簡化成幾何管線(又稱為世界空間管線,NV文件說法)、像素管線(又稱為屏幕空間管線,NV文見說法)
越前面越複雜難以並行,又可以為這些管線細分幾個步驟,幾何管線(圖元分配、頂點屬性獲取(VAF)、頂點著色器)而頂點著色器到像素著色氣或歸納於幾何的後部分,VPC(剔除單元)->RAS(光柵化器),而到像素管線則經由TMU獲取紋理和ROP寫入等最終輸出。
頂點著色器隨著版本改進逐步想達成替換頂點著色器各種限制,幾何著色器(DX10)、細分曲面著色器(DX11)、網格著色器(DX12),想要兼具高效與靈活。
________________
而現在除了VPC累死和RAS轉換不快,其實影響大概也就一些時間,而不管怎麼丟棄當大量頂點數據進入且必須計算的時候,就得至少付出80~90%在幾何管線的時間,是必須經過這些步驟到像素前的設置轉換,才進行一些所謂的硬件剔除的,才同時做所謂的世界空間到攝像機空間、屏幕空間轉換等等云云,所以大量的頂點數據基本上是壓垮現代GPU幾何效率的部分。
而如果你很好正規的製作資產,這些模型做得很好,大概每3個三角形對應2個頂點,做得比較好會接近每2個三角形對應1個頂點,你可以知道大概以三角形數量而言,約50~66%比例算出大致的頂點數量。
如果你完全不懂整個流程,不懂分割UV島這些,細碎亂分毫無規則感,甚至會導致頂點重複計算,從而導致頂點數量翻倍,從而嚴重加重渲染負荷。
______________
影響有多大?非常大!
因為你多個渲染步驟,本質上都是重複走上述的管線N次,也就是說你想算出一些效果就會走頂點到像素,下個步驟也是頂點到像素,N個步驟後結合成功輸出最終畫面。
而畫面中人物數量越高,呈現線性增長幾何負荷,但是不線性增長像素負荷,這是因為會取決於渲染面積,遠處的avatar佔據面積小,近處佔據面積大,甚至結合剔除機制省下一些不必要渲染的像素開銷,增長十幾倍幾何開銷也僅只會增長數倍像素開銷。
像素與分辨率呈正比,且大量相對同質好走訪數據,利用率普遍相對高利用率。
幾何如果是簡單的靜態mesh還好,如果你是蒙皮mesh需要變形,並行度就會受到限制難上升,盡管一些渲染步驟仍然能大幅提高利用率,但通常負荷非常沉重,提高利用率遠不如增加的負荷,會顯著降低幀數。
______________
大概怎麼估算負荷?
以大量蒙皮為例,大概約20%RAS利用率,30%多頂點VAF利用率瓶頸,同時也可能導致L2瓶頸,通常是VAF,但VAF極受單元數量甚至緩存系統,非常難以計算且動態,還受到許多導入模型設置等影響。
(利用率受前端數量影響也挺多,前端越多通常利用率越低甚至會崩跌(本質上是無法並行導致可以通過的數量有限,數量越多導致分得越多,從而呈現利用率過低))
大概估算方式是先算RAS,假設頂點負荷重-20~30%的幀數。
先取得GPU的前端數量,例如一張顯卡擁有5個前端(是個3060ti/4070ti),頻率在1.8Ghz/2.6Ghz,則計算如下...
可以得到理論值為9、13,利用率計算出約1.8GTri、2.6Gtri,而受到頂點數據很好-5%,但普遍20~30%,這裡取20%計算。
1.8*(1-0.2)=1.44Gtri
2.6*(1-0.2)=2.08Gtri
因為普遍使用toon shader,這裡使用輪廓。
假設150K tri 是活動且在攝像機內,計算完輪廓為300k tri。
直射光或稱主光燈時,僅計算一次,而大多數為了能在場景中表現動態的亮暗,和有效在法線產生二值化的toon shader上產生顯著效果,打上了像素燈光,導致通道(pass)增加。
而必須重複計算的結果,當使用一盞光源,導致重複計算完到600k tri,如果為兩盞燈(每盞燈範圍越大容易重複覆蓋,只要覆蓋到的模型部分就會導致重計算,這裡簡化成剛好模型所有網格被全部都照到)都照到計算到900k tri。
這裡設下標準,不開鏡子下直接看到這些所有avatar一共10個。
10*600k tri=6M
10*900k tri=9M
分別轉換單位計算,從上面1.44、2.08轉換到1440M、2080M。
可以得到大約240、347fps,在6M tri下。
或160、231fps,在9M tri下。
接下來假設幾何非常沉重,導致整體時間佔比剛好頂到一個極限左右,75%時間佔比(不詳細解釋原因,因為太長),其他部分被像素佔據,並且像素不更沉重的情況下。
分別得到180fps、260fps (6M)和120fps、173fps。
不考慮場景及其他更重負荷情況下的fps。如果你的顯卡僅是3060、6600XT之類等級,可能更低,例如以3060來說大概3個,雖然利用率更高些。
簡易估算大概*0.7(對於3060ti)->108fps(6M 1燈)、84fps (9M 2燈),你可以理解為什麼GPU負荷這麼高。
如果你開啟鏡子,利用率會稍微上升,並假設全部看見,負荷會增至原有1.8~1.9倍。
對於3060你會得到以下結果
57~60fps (6M tri 1燈),44~47fps (9M tri 2燈)
對於3060ti你會得到以下結果
95~100fps( 6M tri 1燈),63~67fps(9M tri 2燈)
對於4070ti你會得到以下結果
137~144fps(6M tri 1燈),91~96fps(9M tri 2燈)
如果你一次看到更多avatar,或燈光設計不合理密集或單燈過大範圍,負荷會更大,請將更多avatar盡可能優化,部分活動avatar超過25萬三角形不少算少有點離譜。
以上是大致的典型值,可供參考估算。
請勿使用在超過3060ti、4070ti以上規格前端的GPU,會導致計算不準確,結果會近似以上,等未來計算著色器替換頂點著色器以計算著色器蒙皮合批利用可以『近似』估算,雖然近似估算誤差大。