Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- Direct12優化

原文: Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- Direct12優化


第一章:向量代數
一、向量計算的時候,使用XMVECTOR(能夠利用SIMD優勢);類成員變量使用XMFLOAT2 (2D),XMFLOAT3 (3D),和XMFLOAT4 (4D) 。
二、向函數傳遞參數的時候(XMVECTOR能夠直接傳遞到SSE/SSE2)前三個參數類型要定義爲FXMVECTOR; 第四個要定義爲GXMVECTOR; 第五個和第六個要定義爲HXMVECTOR; 其餘參數要定義爲CXMVECTOR。css


第二章:矩陣代數
一、用以計算的時候使用XMMATRIX類型;類的成員變量使用XMFLOAT4X4;
二、向函數傳遞參數時,規則和XMVECTOR同樣;
三、上述規則對於構造函數是例外,構造函數一直使用CXMMATRIX,而且不要添加XM_CALLCONV。html


第三章:變換
一、正交矩陣的逆矩陣和它的轉置矩陣相等,因此計算起來更高效;
二、根據矩陣的乘法結合律,咱們能夠將多個變換矩陣合成爲一個變化矩陣。web


第四章:Direct 3D初始化
一、爲了優化全屏模式下的性能,準確匹配顯示模式就很重要,好比刷新頻率。算法


第五章:渲染流水線
一、類成員變量XMCOLOR,計算時使用XMVECTOR;
二、128位顏色用來進行高精度的計算,這樣算法上的錯誤積累就少不少;最終顏色通常保存爲32位(在back buffer中也一般是32位),當前的物理顯示設備沒法體現128位顏色的好處;數組


第六章:在Direct3D中繪製
一、若是PS上裁切像素,儘量早clip掉,由於這樣像素不會進行後面的PS計算;
二、對於硬件優化,一個像素片斷是有可能直接跳過像素着色器,好比(early-z rejection),可是在有些狀況下,這個功能會沒法使用,好比若是像素着色器中修改了Z值,那麼每一個像素必須進行像素着色器計算後才能獲得最終的Z值;性能優化


第七章:在Direct3D中繪製(二)
一、不要在着色器中使用太多的常量緩衝,爲了性能[Thibieroz13]建議保持在5個如下;
二、每個繪製調用都會以當前設置的根參數對象狀態來執行。這樣能夠正常執行,由於硬件會爲每個繪製調用自動保存一份根參數對象的snapshot。也就是說根參數對象會在每次繪製調用中自動進行版本管理。爲了性能優化,咱們應該儘量讓根簽名更小,其中一個緣由是每一個繪製調用中對根參數對象的自動版本管理,根簽名越大,須要的開銷就越大。更進一步,SDK文檔建議跟參數應該根據改變的頻率來排序(從高到低),而且儘量減小根簽名的切換。因此在多個PSO中共享一個根簽名是一個不錯的主意。因此建立一個「super」根簽名在多個着色器程序中共享,即便部分參數在部分着色器中不須要使用,也能夠優化性能。可是若是這個「super」根簽名太大就會讓減小切換得到的好處變小。markdown


第八章:光照
一、全局光照的計算量沒法應用到實時程序,遊戲中通常使用局部光照。ide


第九章:貼圖
一、咱們能夠將多個圖片放到一個大紋理中(texture atlas),而後應用於多個物體。這樣能夠避免屢次資源加載,減小DrawCall,優化性能;
二、使用DDS格式文件,GPU能夠直接原生使用不少它的文件格式;而且它支持壓縮,可讓GPU原生解壓縮;
三、根據DX11的文檔:定義完整類型的格式,能夠進行運行時的優化。也就是說爲了性能,只有當你真正須要無類型格式,不然都定義成完整類型的格式;svg


第十章:混合
一、混合操做是須要更多的逐像素計算,因此是消耗較多的性能,因此只有當須要使用的時候打開它,使用完成後就關閉它;
二、Alpha測試會消耗性能,因此只有當咱們須要的時候再開啓它;函數


第十一章:模板測試
一、顯卡可能會每幀在同一個點上繪製屢次,這種覆蓋會影響到性能,由於它在重複繪製看不到的點。因此測量深度複雜度對優化分析就頗有用;
二、深度測試時在輸出合併階段執行的(像素着色器以後)。因此即便像素後續會被放棄,可是仍是會進行很耗時的像素着色器計算。可是現代的顯卡提供了一個叫早期Z測試(early z-test)的技術,可讓Z測試在像素着色器以前進行。爲了可以獲得這個技術帶來的重要的好處,你須要在繪製沒有混合的物體的時候,進行從前日後的順序進行繪製,這樣最近的物體會先繪製,而後被遮擋的物體會被這個early z-test技術剔除,它會對具備高深度複雜度的場景帶來大量的性能提高。對於early z-test技術咱們沒法使用D3D API進行控制,它徹底是由顯卡驅動斷定控制的。好比若是你的像素着色器中修改了像素的Z值,那麼early z-test將沒法進行;


第十二章:幾何着色器


第十三章:計算着色器
一、因此若是你的GPU有16個多處理器,那麼你至少要把你的需求劃分爲16個線程組,這樣你全部的多處理器均可以同時計算。爲了有更好的性能,你應該爲每一個多處理器劃分2個線程組,這樣就能夠切換線程組([Fung10]);
二、硬件把這些線程劃分爲warps(32個線程爲一個warp),而後warps被多處理器以SIMD32來處理。每一個CUDA core處理一個線程而且回顧「Fermi」多處理器,有32個CUDA cores。在D3D中你能夠用一個不是32的倍數的值指定一個線程組的大小,可是出於性能考慮,最好仍是指定爲warp大小的倍數([Fung10]);
三、尺寸最好是wavefront的倍數(由於同時也是warp的倍數),這樣就能夠同時兼容兩種顯卡;
四、作模糊效果時,對於9x9的矩陣,咱們須要81個採樣。可是分離到2個1D的時候,咱們只須要18個採樣。尤爲咱們是在模糊紋理,紋理提取是很消耗性能的,因此經過分離模糊來減小紋理採樣能夠提升性能;
五、上面的步驟須要咱們先進行正常的渲染流水線,而後切換到CS進行計算,而後切換回渲染流水線。這樣的切換是由開銷的([NVIDIA10])應當儘量避免這樣的切換;
六、模糊是一個很佔用性能的操做,它的運算量主要與紋理的大小相關。通常狀況下咱們渲染到紋理的時候,能夠渲染到一張比後置緩衝小的紋理上。這樣能夠提升渲染的紋理的速度;由於尺寸減少了,因此提升了模糊的速度;最終繪製到後置緩衝的時候,由於用了放大濾波器,又增長一層模糊效果;
七、線程組提供共享內存,訪問它跟訪問硬件cache同樣快,它能夠用來優化或者一些算法的實現。在CS中,它的定義以下:groupshared float4 gCache[N]; 數組大小能夠是任意數,可是不能超過32kb,出於性能考慮,它的大小應該不超過16kb,不然不能讓2個線程組指定到用一個多處理器;


第十四章:曲面細分階段
一、D3D11硬件支持的最大細分因子是64。若是全部細分因子都是0,那麼當前patch就拒絕進入後面的階段。它能夠幫助咱們基於patch在背面消除和視錐體裁切上實現優化;
二、具體裁切多少主要基於需求,不要作不須要的裁切來浪費性能;
三、若是細分因子是1(也就是不細分),走一遍細分階段流程是浪費GPU開銷;
四、由於是基於GPU實現的,不要細分一個覆蓋小於8個像素的這種過小的三角形;
五、批量調用具備細分的繪製調用(頻繁打開和關閉曲面細分很是浪費性能);
六、曲面細分能夠優化內存,也能夠減小物理和動畫運算(在低模上計算),能夠實現LOD(之前只能放到CPU);


第十五章:第一人稱攝像機和動態索引
一、最小化descriptors可讓咱們的根簽名更小,這表明每一個繪製調用形成更少的性能開銷;


第十六章:實例化和截頭錐體裁切


第十七章:拾取
一、爲了優化考慮,咱們先進行物體包圍體檢測,只有檢測經過的物體再遍歷每一個三角形檢測;


第十八章:立方體貼圖
一、在之前,應用一般優先繪製天空,而後使用它替換掉渲染目標,和深度/模板緩衝。可是「ATI Radeon HD 2000 Programming Guide」反對這個作法,緣由有下:第一,深度/模板緩衝會爲了內部硬件優化被明確的清空掉,對於渲染目標也是同樣的;第二,由於大部分天空都是被其餘物體好比建築和地形遮擋的,因此若是咱們先繪製天空,會致使不少像素須要從新繪製,這樣很浪費性能。因此如今推薦最後再清空和繪製天空;


第十九章:法線貼圖
一、若是你要使用壓縮紋理格式保存法線貼圖,使用BC7 (DXGI_FORMAT_BC7_UNORM)格式是最好的效果,它能夠減小由壓縮法線貼圖形成的錯誤;


第二十章:陰影貼圖
一、目前爲止,咱們使用4次測試的PCF內核,更大的內核會獲得更平滑的邊緣,可是會更消耗性能。觀察上面的例子,其實只須要在邊緣進行PCF,內部是不須要的,根據這個需求,衍生出了其餘算法。[Isidoro06b]描述了一種方案,在着色器代碼中須要動態分支:只有在邊緣進行PCF。這種檢測邊緣又會帶來其餘性能開銷,因此選擇方案的時候要作好利弊分析;
二、這裏像素着色器沒有返回值,是由於咱們只輸出深度值。像素着色器只用以裁剪透明的像素片斷。若是不須要根據透明度進行裁剪,咱們能夠設置像素着色器爲null,這樣可讓性能更高;
三、若是渲染陰影貼圖的時候包含曲面細分幾何體,咱們須要曲面細分要和攝像機渲染時的細分保持一致;也就是說相機與物體的距離和光源與物體的距離要差很少,不然陰影會出現錯誤。一種優化的方案是,渲染陰影貼圖的時候不使用曲面細分。(這種優化用準確性交換速度);
四、構造函數經過分辨率和viewport來建立紋理。分辨率影響了陰影的效果,高分辨率會須要更多性能開銷和內存;
五、PCF的缺點在於它須要4次採樣,在現代顯卡上,採樣操做是很費性能的操做之一,由於GPU的內存帶寬和延時並無像它計算能力那樣獲得提升[Möller08]。幸運的是,DX11圖形硬件內置了支持PCF的方法SampleCmpLevelZero;


第二十一章:環境光遮蔽
一、實時程序使用屏幕空間環境光遮蔽(SSAO),沒法使用光線追蹤環境光遮蔽,由於計算量太大;
二、爲了性能,SSAP貼圖使用半分辨率;


第二十二章:四元數


第二十三章:角色動畫

相關文章
相關標籤/搜索