在绘制时间和交换等待之间进行辨别

时间:2013-11-10 00:05:26

标签: opengl timing

我有一些绘制场景的例程,然后交换缓冲区,因为我将交换等待设置为1,调用可能会阻止等待垂直同步。

是否可以测量绘制场景所花费的时间,以及等待垂直同步的时间?我试着做以下事情:

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

但它似乎不起作用,至少在我的硬件和驱动程序上,因为endswapend始终是相同的。

1 个答案:

答案 0 :(得分:0)

你的时钟分辨率不够。使用std::chronoboost::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. 您将在不同平台,不同供应商甚至驱动程序版本上获得截然不同的结果。衡量它真的有意义吗?
  4. 您根本不需要致电glFinish()
  5. 如果您使用的是Windows和MSVC编译器,请不要使用std::chrono。请改用boost::chronoQueryPerformanceCounter
  6. AFAIK交换阻止取决于驱动程序的实现。通常它是非阻塞的,因为供应商以线程方式实现它。如果您有疑问,最好将计算(但不是渲染)移到单独的线程上。