91色色视频手机版_久久综合亚洲色hezyo_欧美精品色精品一区二区三区_色欲v国产日韩欧美精品视频_久久91超碰色中文字幕总站

歡迎光臨深圳市凱迪賢模具有限公司官網(wǎng)!
0755-26825352
18948189678
優(yōu)化3D圖形渲染通道負載

/ 2021/6/5 10:43:41

一般來(lái)說(shuō), 定位渲染通道瓶頸的方法就是改變渲染通道每個(gè)步驟的工作量, 如果吞吐量也改變了, 那個(gè)步驟就是瓶頸.。找到了瓶頸就要想辦法消除瓶頸, 可以減少該步驟的工作量, 增加其他步驟的工作量。


一般在光柵化之前的瓶頸稱(chēng)作”transform bound”, 三角形設置處理后的瓶頸稱(chēng)作”fill bound”定位瓶頸的辦法:


1.改變幀緩沖或者渲染目標(Render Target)的顏色深度(16 到 32 位), 如果幀速改變了, 那么瓶頸應該在幀緩沖(RenderTarget)的填充率上。


2.否則試試改變貼圖大小和貼圖過(guò)濾設置, 如果幀速變了,那么瓶頸應該是在貼圖這里。


3.否則改變分辨率.如果幀速改變了, 那么改變一下pixel shader的指令數量, 如果幀速變了, 那么瓶頸應該就是pixel shader. 否則瓶頸就在光柵化過(guò)程中。


4.否則, 改變頂點(diǎn)格式的大小, 如果幀速改變了, 那么瓶頸應該在顯卡帶寬上。


5.如果以上都不是, 那么瓶頸就在CPU這一邊。


優(yōu)化方法36條:


1.盡量減少無(wú)用的頂點(diǎn)數據, 比如貼圖坐標, 如果有Object使用2組有的使用1組, 那么不 要將他們放在一個(gè)vertex buffer中, 這樣可以減少傳輸的數據量。


2.使用多個(gè)streamsource, 比如SkinMesh渲染, 可以把頂點(diǎn)坐標和法線(xiàn)這些每一幀都要修改的數據放在一個(gè)動(dòng)態(tài)VB中, 其它不需要修改的(如貼圖坐標)放到一個(gè)靜態(tài)VB中, 這樣就減少了數據傳輸量。


3.盡量使用16位的索引緩沖,避免32位的. 一方面浪費帶寬, 一方面也不是所有的顯卡都支持32位的索引緩沖。


4.可以考慮使用vertex shader來(lái)計算靜態(tài)VB中的數據.比如SkinMesh的頂點(diǎn)可以放到vectex shader中計算, 這樣就可以避免每一幀都從AGP內存中向顯存傳送數據. 這樣也可以使用靜態(tài)VB了。


5.堅決避免使用Draw**UP一族的函數來(lái)繪制多邊形。


6.在設計程序之前好好規劃一下顯卡內存的使用, 確保framebuffer, 貼圖, 靜態(tài)VB能夠正好放入顯卡的本地內存中。


7.盡量使頂點(diǎn)格式大小是32字節的倍數.可以考慮使用壓縮過(guò)的頂點(diǎn)格式然后用vertex shader去解. 或者留下冗余的部分, 使頂點(diǎn)大小剛好使32字節的倍數。


8.頂點(diǎn)在頂點(diǎn)緩沖中的順序盡量符合繪制的順序, 考慮使用strips來(lái)代替list。


9.如果可能盡量多的使用static vertex buffer代替dynamic vertex buffer。


10.動(dòng)態(tài)VB使用DISCARD參數來(lái)lock更新, 使用NOOVERWRITE來(lái)添加.盡量不要使用不帶參數的lock調用(0)。


11.盡量減少lock的次數, 有些東西并不一定非要每一幀都更新VB, 比如人物動(dòng)畫(huà)一般每秒鐘更新30次VB基本上就夠了。


12.如果是因為需要繪制的頂點(diǎn)數據太多了可以考慮使用LOD, 但是現在的顯卡的繪制能力都很強勁, 所以需要權衡一下LOD是否能夠帶來(lái)相應的好處, 如果過(guò)分的強化LOD很可能將瓶頸轉移到CPU這邊。


13.避免過(guò)多的頂點(diǎn)計算,比如過(guò)多的光源, 過(guò)于復雜的光照計算(復雜的光照模型), 紋理自動(dòng)生成的開(kāi)啟也會(huì )增加頂點(diǎn)的計算量. 如果貼圖坐標變換矩陣不是單位矩陣, 也會(huì )造成頂點(diǎn)計算量的增加, 所以如果紋理變換已經(jīng)結束, 記得要將紋理變換矩陣設為單位矩陣同時(shí)調整貼圖坐標。


14.避免Vertex shader指令數量太多或者分支過(guò)多, 盡量減少vertex shader的長(cháng)度和復雜程度. 盡量使用swizzling代替mov。


15.如果圖象質(zhì)量方面的計算(pixel shader)范圍很大, 并且很復雜, 可以考慮試試全屏反走樣。說(shuō)不定更快。


16.盡量按照f(shuō)ront – back的順序來(lái)繪制。


17.在shader中判斷Z值可以避免繪制不可見(jiàn)的象素, 但是nvidia建議簡(jiǎn)單的shader不要這么做.(Don't do this in a simple shader)。


18.如果可能, 盡量使用vertex shader來(lái)代替pixel shader.將計算從逐象素變成逐頂點(diǎn)。


19.盡量降低貼圖的大小.過(guò)大的貼圖可能造成貼圖cache過(guò)載, 從而導致貼圖cache命中降低.過(guò)大的貼圖會(huì )導致顯存過(guò)載, 這時(shí)候貼圖是從系統內存中取的。


20.只要可能就用16位色的貼圖, 如環(huán)境貼圖或者shadow map.它們用32位色的貼圖實(shí)在是浪費。


21.考慮使用DXT 貼圖壓縮。


22.如果可能,使用簡(jiǎn)單的貼圖過(guò)濾或者mip map, 除非必要否則盡量不要使用三線(xiàn)過(guò)濾和各項異性過(guò)濾. light map 和 環(huán)境貼圖基本上都不需要使用它們。


23.只有真正需要修改的貼圖才使用Dynamic, 并且使用DISCRAD和WRITEONLY來(lái)lock。


24.太多的幀緩沖讀寫(xiě)可以考慮關(guān)閉Z-Writes如有些多pass的渲染中的后續pass或者粒子系統等半透明幾何物體如果可以)。


25.可能的話(huà)盡量使用alpha test代替alpha blending。


26.如果不需要stencil buffer就盡量使用16位的Z buffer。


27.減小RenderTarget 貼圖的大小, 如shadow map 環(huán)境貼圖. 可能根本不需要那么大效果就很好。


28.Stencil 和 Z buffer 盡量一起clear. 他們本來(lái)就是一塊緩沖。


29.盡量減少渲染狀態(tài)的切換, 盡量一次畫(huà)盡可能多的多邊形。根據顯卡性能決定最多畫(huà)多少, 不過(guò)一般再多也不會(huì )多到哪里去。 除非你根本不需要貼圖和渲染狀態(tài)的切換)。


30.盡量使用shader來(lái)代替Fixed Pipeline。


31.盡量使用shader來(lái)實(shí)現來(lái)取代Multipass渲染效果。


32.盡量?jì)?yōu)先先建立重要的資源, 如Render target, shaders, 貼圖, VB, IB等等.以免顯存過(guò)載的時(shí)候它們被創(chuàng )建到系統內存中。


33.堅決不要在渲染循環(huán)中調用創(chuàng )建資源。


34.按照shader和貼圖分組后再渲染.先按照shaders分組再按貼圖。


35.Color Stencil Z buffer盡量在一次Clear調用中清除。


36.一個(gè)Vertex buffer 的大小在2M-4M之間違禁詞。



服務(wù)熱線(xiàn)

0755-26825352

企業(yè)微信銷(xiāo)售咨詢(xún)