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的物體應該集中繪製。這樣可以減少狀態切換開銷。