2013-11-10 27 views
2

我有一些例程繪製一個場景,然後交換緩衝區,因爲我已經交換等待設置爲1,該調用可能會阻止等待垂直同步。Discerne之間的抽獎時間和交換等待

是否可以測量繪製場景花費了多少時間,以及等待垂直同步有多少?我試圖做到以下幾點:

start = clock(); 
drawstuff(); 
glFinish(); 
end = clock(); 
SwapBuffers(); 
swapend = clock(); 

,但它似乎沒有工作,至少與我的硬件和驅動程序,因爲endswapend都是一樣的。

+0

我一直在嘗試幾乎相同的事情,我得到了不同的顯卡型號不同的結果(特別是與不同的品牌 - 我得到了ATI HD 4250M,ATI HD 4650,Nvidia GT 640和Nvidia GTX 680)。我得出的結論是,這是依賴於實現的,或者如果沒有特定的解決方案直接從驅動程序中檢索時間,就無法獲得這些時間。 –

+0

你也得到了'swapend == end'嗎? –

+0

是的,在4250M。 GT 640我有不同的價值。其他人我現在無法改變,因爲他們是更高端的牌,我沒有真正關注他們的基準。 –

回答

0

你的時鐘分辨率是不夠的。使用std::chrono,boost::chrono或平臺特定的時鐘。

實施例(ideone):

#include <chrono> 
#include <thread> 
#include <iostream> 

using std::chrono::high_resolution_clock; 
using std::chrono::duration_cast; 
using std::chrono::nanoseconds; 
using std::chrono::microseconds; 

typedef std::chrono::high_resolution_clock myclock; 
typedef myclock::time_point time_point; 
typedef myclock::duration duration; 

auto time_to_wait = microseconds(1000); 

inline void doStuff() 
{ 
    std::this_thread::sleep_for(time_to_wait); 
} 

int main() 
{ 
    time_point start, end; 
    start = myclock::now(); 
    doStuff(); 
    end = myclock::now(); 

    auto elapsed = duration_cast<microseconds>(end - start); 
    std::cout << elapsed .count() << " microseconds elapsed\n"; 
} 

注:

  1. 更好地利用分析器。
  2. 更好的使用圖形分析器。
  3. 在不同的平臺,不同的供應商甚至是驅動版本上,你會得到非常不同的結果。它是否真的有意義衡量?如果您使用Windows和MSVC編譯器,請不要使用std::chrono。改爲使用boost::chronoQueryPerformanceCounter
  4. AFAIK交換阻塞取決於驅動程序的實現。通常情況下,它是非阻塞的,因爲供應商以線程方式實施它。如果您有疑問,將計算(而不是渲染)移動到單獨的線程總是個好主意。
+0

抱歉誤會,'clock()'是一種僞代碼,當然我使用的東西在幾十納秒 –