• <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>

            永遠也不完美的程序

            不斷學習,不斷實踐,不斷的重構……

            常用鏈接

            統計

            積分與排名

            好友鏈接

            最新評論

            D3D性能優化(轉)

            出處:http://blog.csdn.net/compiler/archive/2009/03/10/3975239.aspx
            常規技巧

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

            本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/compiler/archive/2009/03/10/3975239.aspx

            posted on 2009-06-30 08:50 狂爛球 閱讀(1092) 評論(0)  編輯 收藏 引用 所屬分類: 圖形編程

            久久精品国产99国产精偷| 狠狠色婷婷久久综合频道日韩| 久久中文字幕视频、最近更新| 国产精品久久久久9999高清| 久久婷婷五月综合国产尤物app| 国产69精品久久久久9999| 亚洲人成伊人成综合网久久久| 九九热久久免费视频| 青青青青久久精品国产| 成人精品一区二区久久| 久久国产三级无码一区二区| 亚洲欧美精品伊人久久| 久久精品国产WWW456C0M| 久久久久久A亚洲欧洲AV冫| 亚洲精品国产自在久久| 欧美牲交A欧牲交aⅴ久久| 99久久成人国产精品免费| 久久中文字幕一区二区| 久久久这里有精品| 久久99热只有频精品8| 岛国搬运www久久| 国产成年无码久久久久毛片| 亚洲午夜精品久久久久久浪潮| 久久精品国产亚洲AV嫖农村妇女| 99久久伊人精品综合观看| 久久久久久久久波多野高潮| 久久高潮一级毛片免费| 一本久久久久久久| 欧美午夜精品久久久久免费视| 亚洲国产精品无码久久青草| 人妻精品久久久久中文字幕69 | 婷婷综合久久中文字幕蜜桃三电影| 99久久婷婷免费国产综合精品| 久久夜色精品国产亚洲| 国产999精品久久久久久| 亚洲一区二区三区日本久久九| 久久久无码一区二区三区| 狠狠色综合网站久久久久久久| 93精91精品国产综合久久香蕉| 国产成人精品免费久久久久| 77777亚洲午夜久久多喷|