昨天把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。
FastScene
9 個月前
請問post-pass和pre-pass是甚麼意思阿? 感恩
回覆刪除post-pass,比較正確的說法是post-process,
回覆刪除而pre-pass,則是pre-process。
在中文解釋是「後置處理」和「前置處理」。
後置處理就比較好說明,
有如就是拿一張圖片去說一些修正,
像比較知名的修圖軟體:photoshop。
恩..簡單說:就是抓取記憶體裡面的pixel作一些修。
前置處理:會用此的,比較有名的是deferred shading。就是要render object之前,
必須要抓一些資訊給vertex or pixel shader去使用。