• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            麒麟子

            ~~

            導(dǎo)航

            <2010年9月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            統(tǒng)計(jì)

            常用鏈接

            留言簿(12)

            隨筆分類(lèi)

            隨筆檔案

            Friends

            WebSites

            積分與排名

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            優(yōu)化3D圖形流水線(xiàn)

            轉(zhuǎn)自:http://hi.baidu.com/freedomknightduzhi/blog/item/7e401a9b2521eeb3c9eaf4f1.html
            在使用NVIDIA PerfHUD 5 Launcher的時(shí)候,明顯發(fā)現(xiàn)現(xiàn)在的CPU時(shí)間和GPU時(shí)間不均衡,于是考慮優(yōu)化。
            下面是參考NVIDIA的OGP開(kāi)始總結(jié)。
            優(yōu)化代碼通常是找出瓶頸,對(duì)瓶頸進(jìn)行優(yōu)化,這里暫不考慮CPU內(nèi)部的優(yōu)化方法,主要記錄CPU->GPU的3D渲染流水線(xiàn)的瓶頸查出方法以及優(yōu)化手段。
            若僅希望進(jìn)行CPU方面的優(yōu)化,可使用一些輔助工具,如Inter的Intel(R) VTune(TM) Performance Analyzer,Intel(R) Thread Profiler 3.1,AMD的CodeAnalyst等。
            進(jìn)行優(yōu)化的步驟如上面所說(shuō):1:找出瓶頸,2:對(duì)其優(yōu)化。
            最通用也最有效的找出瓶頸的方法當(dāng)然是找到核心函數(shù),降低它的時(shí)鐘周期和負(fù)荷,看是否對(duì)程序性能有大的影響。優(yōu)化的手段多是拆東補(bǔ)西而已,即,將影響性能的瓶頸中的任務(wù)分配給其他較空閑的部分進(jìn)行處理,來(lái)平衡整體所消耗的時(shí)間。
            那么來(lái)看一下圖形渲染流水線(xiàn)大致過(guò)程。
            1:系統(tǒng)CPU從內(nèi)存中讀取幾何頂點(diǎn) -> 輸送到GPU顯存 -> 輸送到GPU高速頂點(diǎn)緩沖區(qū) -> GPU頂點(diǎn)著色 -> GPU建立三角型 -> GPU矩陣變換 -> GPU光柵化 -> 3
            2:系統(tǒng)CPU從內(nèi)存中讀取紋理信息 -> 輸送到GPU顯存 -> 輸送到GPU高速紋理緩沖區(qū)( DX10.0以后可與頂點(diǎn)緩沖共同,不再?gòu)?qiáng)制區(qū)分 ) -> 3
            3:片段著色光柵化 -> 輸出GPU后臺(tái)緩沖進(jìn)行渲染。
            那么,很簡(jiǎn)單的有幾大模塊在其中可能存在著瓶頸的限制。

            1:CPU本身邏輯計(jì)算能力的限制。

            2:CPU到GPU顯存AGP傳輸能力的限制
            (1)頂點(diǎn)
            (2)紋理
            3:GPU顯存到高速緩沖區(qū)的傳輸帶寬限制
            (1)紋理傳輸帶寬限制     (顯存->高速緩沖區(qū))
            (2)光柵化完畢后的楨傳輸帶寬限制 (高速緩沖區(qū)->顯存)
            注:這里不考慮 頂點(diǎn) 傳輸?shù)膸捪拗疲驗(yàn)檫@個(gè)限制極小
            4:GPU高速緩沖區(qū)內(nèi)部處理能力的限制。
            (1)頂點(diǎn)變換著色處理能力限制。
            (2)頂點(diǎn)最大數(shù)量支持限制。
            (3)三角型建立限制。
            (4)光柵化限制。
            (5)象素著色限制。
            5:內(nèi)存過(guò)小限制。
            6:顯卡顯存過(guò)小,以及其他硬件Caps限制。

            上述就是常見(jiàn)3D圖形渲染流水線(xiàn)中的瓶頸限制,那么我們下一步去一一確定,可能是哪方面的瓶頸。簡(jiǎn)單的方法是檢測(cè)FPS。
            注意1:許多瓶頸可能由于硬件更變而更變。
            注意2:Debug模式和Release模式的瓶頸表現(xiàn)未必相同。
            注意3:查看FPS時(shí)候一定關(guān)閉垂直同步。
            1:改變色深,16bit,32bit,這個(gè)是直接影響 楨渲染緩沖 的大小的,若修改了此項(xiàng)之后,F(xiàn)PS有較大變化,則是由于3.2 楨傳輸帶寬限制。
            注:這里需要改變所有渲染對(duì)象的色深。
            2:改變紋理大小尺寸,改變紋理過(guò)濾方式,若修改了此項(xiàng)之后,F(xiàn)PS有較大變化,則是由于3.1 紋理傳輸帶寬的限制 或 2.2 紋理AGP傳輸能力限制。
            注:紋理過(guò)濾方式中,點(diǎn)過(guò)濾速度 > 線(xiàn)性過(guò)濾速度 > 三角面過(guò)濾速度 > 各向異性過(guò)濾速度 若改變紋理過(guò)濾方式就將FPS提高了,則是3.1 紋理傳輸帶寬的限制。這步是將紋理數(shù)據(jù)從顯存運(yùn)輸?shù)紾PU高速紋理緩沖區(qū)的過(guò)程。
            3:改變桌面分辨率,若修改了此項(xiàng)之后,F(xiàn)PS有較大變化,則是由于 4.4 光柵化限制 或是 4.5 象素著色Shader限制。
            此時(shí)減少 PixelShader指令數(shù)量,若修改了此項(xiàng)之后,F(xiàn)PS有較大變化,則是由于 4.5 象素著色Shader限制,若沒(méi)有較大變化,則是由于 4.4 光柵化限制。
            4:減少 VertexShader 指令數(shù)量,若修改了此項(xiàng)之后,F(xiàn)PS有較大變化,則是由于 4.1 頂點(diǎn)變換著色處理能力限制。
            5:減少頂點(diǎn)數(shù)量和AGP傳輸速率,若修改了此項(xiàng)之后,F(xiàn)PS有較大變化,則是由于 4.2 頂點(diǎn)最大數(shù)量支持限制 或 2.1 頂點(diǎn)AGP傳輸能力限制。
            6:若以上都不是,則是 1.0 CPU邏輯計(jì)算能力限制。
            注:該項(xiàng)也可根據(jù)NVIDIA PerfHUD來(lái)檢測(cè)CPU和GPU的空閑時(shí)間來(lái)判定,若GPU空閑時(shí)間過(guò)多,則說(shuō)明是由于CPU計(jì)算能力或AGP傳輸能力導(dǎo)致。
            該項(xiàng)也可用簡(jiǎn)單的更換CPU,而不更換GPU的方式來(lái)檢測(cè)判定。
            7:看資源管理器,CPU占用率,內(nèi)存占用率,可以知道是否是由于1.0 CPU本身邏輯計(jì)算能力的限制 或是 5.0內(nèi)存過(guò)小限制。
            8:看DX SDK自帶的CapsViewer可以知道顯卡的支持性,以獲得更多更準(zhǔn)確的判定。
            9:在BIOS中更變APGP為1X模式,若修改了此項(xiàng)之后,F(xiàn)PS有較大變化,則是由于2.1 或 2.2 AGP傳輸能力限制。
            10:降低GPU配置進(jìn)行檢測(cè)判定,此時(shí)要注意兩項(xiàng),一是降低GPU的運(yùn)行頻率,一是降低GPU顯存性能和大小,可以確定GPU方面的問(wèn)題大致所在。
            11:刪除一些游戲中涉及的 物理,AI,邏輯 等占用大量CPU效率的代碼以獲得更強(qiáng)的針對(duì)性。
            12:對(duì)角色,地形,靜態(tài)模型,陰影 等設(shè)置渲染開(kāi)關(guān),以更明確的確定問(wèn)題所在。

            優(yōu)化方法:
            一:整體優(yōu)化。
            1:減少小批量作業(yè)
            (1)讓一個(gè)頂點(diǎn)緩沖中更多頂點(diǎn)。(1024點(diǎn)以上較適合)
            (2)少Draw。(盡量一次性多渲染些三角形,減少渲染次數(shù))
            (3)盡量將多個(gè)尺寸小的紋理文件合并為一個(gè)尺寸大的紋理文件,減少零碎的小紋理文件數(shù)量。
            (4)使用VertexShader將一些關(guān)系緊密的幾何體打包在一起。(VS2.0就已經(jīng)存在256個(gè)4D向量常數(shù))
            2:邏輯排序優(yōu)化
            (1)盡量在邏輯層將頂點(diǎn)進(jìn)行一定的排序以減少在GPU高速緩沖區(qū)中的重新排布。
            (2)盡量將渲染對(duì)象在邏輯層按照深度由屏幕->內(nèi)部排序,減少不必要的深度揀選。
            (3)盡量使用索引條帶或索引列表
            (4)根據(jù)渲染狀態(tài)和渲染對(duì)象對(duì)紋理進(jìn)行基本排序
            3:減少不必要的渲染(CPU層的基本二分四叉八叉這里不再?gòu)?qiáng)調(diào))
            (1)在多Pass渲染時(shí),在第一個(gè)渲染Pass上對(duì)每個(gè)渲染對(duì)象加以咨詢(xún),當(dāng)?shù)谝粋€(gè)Pass中該渲染對(duì)象渲染象素量達(dá)不到指定標(biāo)準(zhǔn),則后續(xù)Pass不再對(duì)其進(jìn)行渲染。
            (2)對(duì)一些重復(fù)渲染(如太陽(yáng)眩光特效)需要進(jìn)行計(jì)數(shù),達(dá)到指定數(shù)量即停止渲染或進(jìn)行分布式渲染。
            (3)對(duì)一些復(fù)雜的模型設(shè)置基本的包圍盒判定其渲染必要性。
            4:減少線(xiàn)程鎖定導(dǎo)致的不必要等待
            (1)CPU Lock了一個(gè)資源,等待GPU進(jìn)行渲染,此時(shí)常見(jiàn)做法有等待GPU渲染,中間期間CPU經(jīng)常處于Idle空閑狀態(tài),建議此時(shí)給CPU其他的事情做,如為下一個(gè)資源做好基本準(zhǔn)備或進(jìn)行邏輯處理。
            5:減少或平均分布CPU壓力(實(shí)際上,大部分程序是CPU邏輯計(jì)算限制的)
            (1)CPU壓力重點(diǎn)在以下方面可能存在: AI,IO,網(wǎng)絡(luò),復(fù)雜邏輯,這些部分可進(jìn)行CPU瓶頸測(cè)試以確定優(yōu)化方向。
            (2)優(yōu)化方針:寧可GPU忙碌也要CPU減壓。
            (3)使用文章開(kāi)始時(shí)我提到的一些工具去查找CPU中不必要的匯編空循環(huán)以及不必要的CPU空閑。
            二:局部?jī)?yōu)化。
            6:AGP傳輸瓶頸
            (1)當(dāng)過(guò)多數(shù)據(jù)通過(guò)AGP8X從CPU內(nèi)存?zhèn)鬟f到GPU顯存時(shí),我們可以選擇以下方式優(yōu)化。
               [1]減小頂點(diǎn)個(gè)數(shù)
               [2]減少動(dòng)態(tài)頂點(diǎn)個(gè)數(shù),使用VertexShader動(dòng)畫(huà)替代。
               [3]正確使用API,設(shè)置正確參數(shù),避免動(dòng)態(tài)頂點(diǎn)和紋理緩沖區(qū)的創(chuàng)建管理。
               [4]根據(jù)硬件配置屬性確定適合的 楨緩沖,紋理緩沖,靜態(tài)頂點(diǎn)緩沖 的大小。
            (2)避免使用無(wú)序或不規(guī)則數(shù)據(jù)傳輸。
               [1]頂點(diǎn)數(shù)量尺寸應(yīng)當(dāng)是32的整數(shù)倍。(可使用頂點(diǎn)壓縮,再在VertexShader中對(duì)頂點(diǎn)數(shù)據(jù)進(jìn)行解壓縮)
               [2]確保頂點(diǎn)的有序性。(在CPU邏輯層對(duì)其進(jìn)行排序后傳輸,NVTriStrip這個(gè)工具可以幫我們生成優(yōu)化的高效的有序的Mesh頂點(diǎn)數(shù)據(jù))
            (3)具體到API層面的幾何Mesh傳輸
               [1]對(duì)于靜態(tài)幾何體,創(chuàng)建 只寫(xiě)的頂點(diǎn)緩沖,且,僅寫(xiě)入一次。
               [2]對(duì)于動(dòng)態(tài)幾何體,在程序初始創(chuàng)建一個(gè)動(dòng)態(tài)頂點(diǎn)緩沖,之后每楨初始鎖定DISCARD,進(jìn)行NOOVEWRITE而不要進(jìn)行DISCARD,DISCARD的耗時(shí)不是NOOVEWRITE可比的。
               [3]基本原則,少創(chuàng)建緩沖區(qū),多對(duì)其進(jìn)行重復(fù)使用,減少鎖定次數(shù)。
            7:頂點(diǎn)變換傳輸處理瓶頸(由于GPU有強(qiáng)大的頂點(diǎn)處理能力,一般在頂點(diǎn)變換方面不會(huì)有瓶頸出現(xiàn),但假若出現(xiàn)了。。)
            (1)頂點(diǎn)太多
               [1]使用細(xì)節(jié)Lod,一般起用2-3級(jí)Lod就足夠了。
            (2)頂點(diǎn)處理過(guò)于復(fù)雜
               [1]減少燈光數(shù)量,降低燈光復(fù)雜度(方向平行光效率 > 點(diǎn)光源效率 > 聚光燈效率 )
               [2]減少頂點(diǎn)著色器指令數(shù)量,避免128條以上指令,避免大量的分支指令
               [3]對(duì)頂點(diǎn)進(jìn)行CPU層邏輯排序
               [4]能在CPU中進(jìn)行計(jì)算的在CPU中進(jìn)行計(jì)算,傳遞常量給GPU
               [5]減少和避免CG/HLSL之中的 mov 指令。即使使用了,也要重點(diǎn)注意。
            8:大部分情況下 4.3 三角形建立限制 以及 4.4 光柵化限制 是不會(huì)成為瓶頸的,但,當(dāng)三角形數(shù)量過(guò)多或者光柵化時(shí)每個(gè)三角形頂點(diǎn)數(shù)據(jù)過(guò)于復(fù)雜時(shí)可能會(huì)出現(xiàn)這種瓶頸,此時(shí)減少三角形總數(shù),使用VS或減少Z-cull三角都是有效的方法。
            9:象素著色器的瓶頸(在DX7之前,全是固定渲染管道,一般來(lái)說(shuō)傳輸量和著色器之間的計(jì)算是均衡的,但是DX8開(kāi)始可編程流水管道開(kāi)始,PixelShader的計(jì)算量開(kāi)始增幅,數(shù)據(jù)傳輸量通常相對(duì)來(lái)說(shuō)比較小了。)
            (1)需處理的紋理片段過(guò)多過(guò)大
               [1]在CPU層按照 屏幕->向內(nèi) Z-Buffer的順序排序傳入,并按照這個(gè)順序進(jìn)行渲染。
               [2]多Pass渲染時(shí),考慮在第一個(gè)渲染Pass中關(guān)閉特效并讓第一個(gè)Pass負(fù)責(zé)Z-buffer的處理。這樣的話(huà),后續(xù)Pass中可以避免渲染不要的紋理片段。
            (2)每個(gè)紋理片段的處理過(guò)于復(fù)雜
               [1]大段的長(zhǎng)著色器指令將會(huì)很大降低效率,嘗試減少著色器指令長(zhǎng)度
               [2]使用向量操作,并行co-issuing來(lái)減少指令數(shù)量。
               [3]混合使用配對(duì)的簡(jiǎn)單的texture和combiner組合指令。
               [4]使用Alpha混合器提高性能。
               [5]考慮對(duì)陰影也進(jìn)行Lod計(jì)算。
               [6]在DX10開(kāi)始,考慮將頂點(diǎn)緩沖移做象素緩沖進(jìn)行使用。
            (3)額外的優(yōu)化方法
               [1]使用fx_12精度
               [2]使用fp16指令
               [3]使用Pixel_Shader2.0的時(shí)候開(kāi)啟ps_2_a描述開(kāi)關(guān)
               [4]減少寄存器的臨時(shí)存取
               [5]減少不必要的精度要求
               [6]盡量使用低版本的Shader(但避免使用VS1.0,已經(jīng)被VS3.0拋棄了)
            10:紋理貼圖導(dǎo)致的瓶頸
            (1)優(yōu)化方法。
               [1]紋理過(guò)濾時(shí)避免使用 三角面性過(guò)濾 和 各相異性過(guò)濾,特殊需求除外,一般線(xiàn)性過(guò)濾已經(jīng)可以做的很好。
               [2]即使使用各相異性過(guò)濾,也要降低相異性比率。使用了各相異性過(guò)濾的話(huà),則可以盡量減少三角面性過(guò)濾。
               [3]降低紋理分辨率,避免使用不必要的高分辨率紋理。
               [4]降低紋理色深,例如環(huán)境紋理,陰影紋理這些,盡量使用16位。
               [5]建議進(jìn)行紋理壓縮,例如DXT格式就可以有效壓縮紋理,并且GPU對(duì)DXT格式支持很好。
               [6]避免使用非二次方的紋理資源。
               [7]在進(jìn)行紋理銳化的時(shí)候,避免使用負(fù)值的Lod進(jìn)行銳化,會(huì)導(dǎo)致遠(yuǎn)處失真,盡量使用各相異性過(guò)濾進(jìn)行銳化
               [8]對(duì)于動(dòng)態(tài)紋理,一般建議用 D3DUSAGE_DYNAMIC D3DPOOL_DEAFAULT 進(jìn)行創(chuàng)建緩沖,使用 D3DLOCK_DISCARD 進(jìn)行鎖定,盡量做到一次鎖定多次使用,不要頻繁解鎖,另外,永遠(yuǎn)不要讀這樣的紋理。
            11:楨緩沖導(dǎo)致的瓶頸
            (1)優(yōu)化方法
               [1]盡量關(guān)閉Z-write,一般來(lái)說(shuō),在一個(gè)渲染Pass中就可以進(jìn)行完整的Z-buffer處理,在后續(xù)的Pass中就應(yīng)當(dāng)關(guān)閉Z-write,不用擔(dān)心,即使需要Alpha混合的對(duì)象也不再需要開(kāi)啟Z-write了。
               [2]盡量開(kāi)始AlphaTest,實(shí)際上這個(gè)操作會(huì)提高效率,而非降低。
               [3]避免使用浮點(diǎn)楨緩存。
               [4]若沒(méi)有啟用模版深度緩沖的話(huà),使用16位的Zbuffer就可以了。
               [5]避免使用RendToTexture,或者可能的去減少Rend的尺寸。
            對(duì)于現(xiàn)在可編程流水管線(xiàn)來(lái)說(shuō),這意味著我們有更大的自由度實(shí)現(xiàn)更多的特效,但也有了更多的瓶頸和更多的復(fù)雜度,我們遇到問(wèn)題要正確的獲取瓶頸所在,開(kāi)動(dòng)腦筋進(jìn)行優(yōu)化,平衡各環(huán)節(jié)間的負(fù)載。讓各環(huán)節(jié)不過(guò)載不空閑。

            更多信息希望您查看Nvidia的《GPU_Programming_Guide》,翻譯成中文則是《GPU編程精粹》。以上。

            posted on 2010-01-29 13:48 麒麟子 閱讀(1990) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): GPU and Graphic

            評(píng)論

            # re: 優(yōu)化3D圖形流水線(xiàn) 2010-01-29 14:31 空明流轉(zhuǎn)

            這本書(shū)明明是編程指南。。。  回復(fù)  更多評(píng)論   

            # re: 優(yōu)化3D圖形流水線(xiàn) 2010-01-29 15:51 Leaf

            @空明流轉(zhuǎn)
            我也想修正,不過(guò)是轉(zhuǎn)載人家的,不好動(dòng)手!!!  回復(fù)  更多評(píng)論   

            久久毛片一区二区| 亚洲?V乱码久久精品蜜桃| 狠狠色婷婷久久一区二区三区| 色综合久久无码中文字幕| 色噜噜狠狠先锋影音久久| 伊人 久久 精品| 国产高潮久久免费观看| 伊人久久综合成人网| 国产毛片久久久久久国产毛片 | 久久精品国产WWW456C0M| 欧美国产成人久久精品| 久久91综合国产91久久精品| 久久99久久99精品免视看动漫 | 久久99精品久久久久久久久久| 伊人久久大香线蕉精品| 很黄很污的网站久久mimi色| 爱做久久久久久| 亚洲国产精品综合久久一线| 亚洲午夜无码久久久久小说| 伊人久久大香线焦综合四虎| 国产精品天天影视久久综合网| 久久精品中文无码资源站| 欧美激情精品久久久久久| 久久成人国产精品二三区| 精品蜜臀久久久久99网站| 久久精品国产清高在天天线| 中文字幕久久精品无码| 亚洲国产小视频精品久久久三级 | 久久精品国产99久久香蕉| 中文字幕亚洲综合久久| 亚洲国产成人久久精品影视| 色诱久久久久综合网ywww | 88久久精品无码一区二区毛片| 久久er99热精品一区二区| 少妇人妻88久久中文字幕| 无码精品久久久久久人妻中字| 亚洲中文字幕久久精品无码喷水 | 国产精品视频久久久| 一级做a爰片久久毛片人呢| 久久激情五月丁香伊人| 久久男人AV资源网站|