[轉載]DirectX 效能最佳化

來源:互聯網
上載者:User
1 只在必須的時候Clear。
   IDirect3DDevice9::Clear函數通常需要花費較多的時間,因此要盡量少調用,而且只清空的確需要清空的緩衝。

2 盡量減少狀態切換。並且將需要進行的狀態切換組合在一起設定。
   狀態包括RenderState,SamplerState,TextureStageState等

3 紋理尺寸儘可能小

4 從前至後渲染情境中的對象
   從前至後渲染可以儘可能早地精選出不需要繪製的對象和象素

5 使用三角條帶代替三角列表和三角扇。為了能更有效利用頂點快取(cache),在排列條帶時因考慮儘快重用頂點。

6  根所需要據消耗的系統資源來逐步減少特效。

7 經常性地檢測程式的效能。
   這樣可以更容易發現引起效能突變的部分

8 最小化頂點緩衝的切換

9 儘可能使用靜態頂點緩衝

10 對靜態對象,對每種FVF使用一個大的靜態頂點緩衝來儲存多個對象的頂點資料,而不是每個對象使用一個頂點緩衝。
   其目的也是減少頂點緩衝的切換

11 如果程式需要隨機訪問AGP記憶體中的頂點緩衝,頂點格式的大小最好是32bytes的倍數。否則,選擇合適的最小的格式。
32bytes 也就是8個float資料或2個vector4。

12 使用頂點索引方式渲染,這樣可以更有效利用頂點快取。

13 如果深度緩衝格式中包含有模版緩衝,總是將兩者一起Clear。

14 將計算結果和輸出的shader指令合并:
// Rather than doing a multiply and add, and then output the data with
//   two instructions:
mad r2, r1, v0, c0
mov oD0, r2

// Combine both in a single instruction, because this eliminates an  
//   additional register copy.
mad oD0, r1, v0, c0

建立一個情境對象的資料庫,首先使用最低精度的模型,在保證效能的前提下逐步使用更高精度的模型。密切關注渲染的總的三角面數。

將使用相同渲染狀態和貼圖的圖元集中在一起繪製,這樣能盡量減少頂點緩衝和狀態的切換。並且將狀態切換操作集中成一組設定。

盡量減少光源數量,使用環境光線來提高亮度。方向光源比點光源和聚光燈更高效,因為光的方向是固定的。使用光照範圍參數來剔除不受光照影響的物體。鏡面高光幾乎使光照計算量加倍,因此只在需要時使用,將D3DRS_SPECULARENABLE設為FALSE,將材質的specular power設為0,將材質的specular color 設為0。

盡量減小紋理尺寸,這樣可以增加紋理被緩衝的可能性。盡量減少紋理的切換,將使用同一紋理的對象集中繪製。盡量使用正方形紋理。最快的紋理是256×256,將4張128×128的紋理拼接成256×256使用。

串連World-View Matrix, 將ViewMatrix設為Identity減少矩陣乘法運算。

動態紋理。首先要檢查D3DCAPS2_DYNAMICTEXTURES來判斷硬體是否支援。
其二,動態紋理不能放在MANAGED pool中。動態紋理總是能鎖定,甚至是在D3DPOOL_DEFAULT中。D3DLOCK_DISCARD是合法的。
DrawProceduralTexture(pTex)
{
    // pTex should not be very small because overhead of
    //   calling driver every D3DLOCK_DISCARD will not
    //   justify the performance gain. Experimentation is encouraged.
    pTex->Lock(D3DLOCK_DISCARD);
    <Overwrite *entire* texture>
    pTex->Unlock();
    pDev->SetTexture();
    pDev->DrawPrimitive();
}

當需要在每幀裡鎖定頂點或索引緩衝是,應該使用動態緩衝(D3DUSAGE_DYNAMIC)。對動態緩衝使用D3DLOCK_DISCARD鎖定能減少延遲。D3DLOCK_NOOVERWRITE鎖定可以用於在緩衝空閑處添加新的資料而不修改已經寫入的資料。

使用Effect時,應該根據Effect,然後根據Technique來安排渲染順序,也就是使用相同Effect和Technique的物體應該集中繪製。這樣可以減少狀態切換開銷。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.