2009年2月11日 星期三

優化pre-pass和post-pass

昨天把real-time sadow整合完畢之後,試著把SSAO加進去。

在繪製大量物件時(註),發現frame降滿多的,

因為以我的神卡是不可能運算過慢,

所以瓶頸還是出在於CPU上。

其實義大利人對於RenderState Change的優化早就有作了,

讓我剩下的優化方式很簡單:就是所有的物件都是instancing。

作用是大大降低DrawXXXX的driver work,

將顯示卡的威能給顯示出來。

這點在DX10作得很好!所以當初為什麼想丟棄DX9的原因。

在這時間點真的要作一下優化了,因為後面還有其他效果要作,

如:SSAO、PSSM、DOF、dynamic lighting、HDR、motion blur。

這是最基本的,後續要作God Rays...等之類,可以讓玩家自由去選擇。

/////// 09/2/16 ///////////////

終於尋找到效能上的問題!

原來是BOOST_FOREACH的使用方式錯誤Orz。

會導致有7000個物件,白白去作拷貝的動作,

其實我的原意並不是這樣。

以下是修正後:


環境:
雙核心 3.01ghz GPU:ATI 4870
解析度:1440 * 900

ssao off

物件總量 = 7400
polygons =308357
drawcall = 733 (包含instance drawcall 的數量)
instance drawcall =527
fps 30

////////////////////////////

ssao on

物件總量 = 7400
polygons = 681737
drawcall = 1281(包含instance drawcall 的數量)
instance drawcall = 995
fps 20



再來是測試少量的instance object

ssao off

物件總量 = 2837
非instance物件總量 = 1736
instance物件總量 = 1101
polygons = 591182
drawcall = 2056(包含instance drawcall 的數量)
instance drawcall = 197
fps 30

////////////////////////////////////

ssao on

物件總量 = 2837
非instance物件總量 = 1736
instance物件總量 = 1101
polygons = 1076542
drawcall = 2552
instance drawcall = 573
fps 25

//////////////////////////////

註:

在雙核心2.66ghz,nvidia 98000GTX+環境下,

假設同一種mesh和單一diffuse color,

繪製16000個geometry,Polys共有545278,開啟instancing之後,

共呼叫23次的draw call,結果fps是120左右。


不開啟instancing時,會呼叫16023次的draw call,fps降到剩下7。



當然這是最佳狀況,主要是mesh的不同,還會格外增加draw call。

DX10可以突破這個缺點,所以要打國戰之類,是可以做到的,

會這樣講是因為看過ATI的最新DX10.1技術,

只要呼叫一次draw call XD。

2 則留言:

  1. 請問post-pass和pre-pass是甚麼意思阿? 感恩

    回覆刪除
  2. post-pass,比較正確的說法是post-process,
    而pre-pass,則是pre-process。
    在中文解釋是「後置處理」和「前置處理」。
    後置處理就比較好說明,
    有如就是拿一張圖片去說一些修正,
    像比較知名的修圖軟體:photoshop。
    恩..簡單說:就是抓取記憶體裡面的pixel作一些修。

    前置處理:會用此的,比較有名的是deferred shading。就是要render object之前,
    必須要抓一些資訊給vertex or pixel shader去使用。

    回覆刪除