通常,定位渲染通道瓶頸的方法就是改變渲染通道每個步驟的工作量, 如果吞吐量也改變了, 那個步驟就是瓶頸。找到了瓶頸就要想辦法消除瓶頸, 以減少該步驟的工作量, 增加其他步驟的工作量。
一般在光柵化之前的瓶頸稱作”transform bound”, 三角形設置處理後的瓶頸稱作”fill bound”定位瓶頸的辦法:
1.改變幀緩沖或者渲染目標(Render Target)的顏色深度(16 到 32 位), 如果幀速改變了, 那麼瓶頸應該在幀緩沖(RenderTarget)的填充率上。
2.否則試試改變貼圖大小和貼圖過濾設置, 如果幀速變了,那麼瓶頸應該是在貼圖這裡。
3.否則改變分辨率.如果幀速改變了, 那麼改變一下pixel shader的指令數量, 如果幀速變了, 那麼瓶頸應該就是pixel shader. 否則瓶頸就在光柵化過程中。
4.否則, 改變頂點格式的大小, 如果幀速改變了, 那麼瓶頸應該在顯卡帶寬上。
5.如果以上都不是, 那麼瓶頸就在CPU這一邊。
優化方法36條:
1.盡量減少無用的頂點數據, 比如貼圖坐標, 如果有Object使用2組有的使用1組, 那麼不 要將他們放在一個vertex buffer中, 這樣可以減少傳輸的數據量。
2.使用多個streamsource, 比如SkinMesh渲染, 可以把頂點坐標和法線這些每一幀都要修改的數據放在一個動態VB中, 其它不需要修改的(如貼圖坐標)放到一個靜態VB中, 這樣就減少了數據傳輸量。
3.盡量使用16位的索引緩沖,避免32位的. 一方面浪費帶寬, 一方面也不是所有的顯卡都支持32位的索引緩沖。
4.可以考慮使用vertex shader來計算靜態VB中的數據.比如SkinMesh的頂點可以放到vectex shader中計算, 這樣就可以避免每一幀都從AGP內存中向顯存傳送數據. 這樣也可以使用靜態VB了。