2013-11-10 5 views
2

У меня есть некоторые подпрограммы, которые рисуют сцену, тогда я меняю местами буферы, и, поскольку у меня есть подкачка ожидания, установленная в 1, вызов может блокировать ожидание вертикальной синхронизации.Дискретность между временем рисования и временем подкачки

Можно ли измерить, сколько времени потрачено на рисование сцены и сколько в ожидании вертикальной синхронизации? Я попытался сделать следующее:

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

но это, кажется, не работает, по крайней мере, с моим аппаратным и водителем, потому что end и swapend всегда одинаковы.

+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. Лучше использовать Profiler.
  2. Еще лучше использовать графический профайлер.
  3. Вы получите самые разные результаты на разных платформах, разных производителях и даже версиях драйверов. Действительно ли имеет смысл измерять?
  4. Вам не нужно звонить glFinish()
  5. Если вы на Windows, и MSVC компилятором, не используйте std::chrono. Используйте вместо этого boost::chrono или QueryPerformanceCounter.
  6. AFAIK Блокировка подкачки зависит от реализации драйвера. Как правило, он не блокируется, поскольку поставщики реализуют его поточно. Если у вас есть сомнения, всегда рекомендуется перемещать ваши вычисления (но не рендеринг) для разделения потока.
+0

Извините за недоразумение, 'clock()' был своего рода псевдокодом, конечно, я использую то, что дает resolutino в наносекундах –

Смежные вопросы