2

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

是否可以测量绘制场景花费了多少时间,以及等待垂直同步花费了多少时间?我尝试执行以下操作:

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

但它似乎不起作用,至少对我的硬件和驱动程序来说,因为endswapend总是一样的。

4

1 回答 1

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 交换阻塞取决于驱动程序的实现。通常它是非阻塞的,因为供应商以线程方式实现它。如果您有疑问,将计算(但不是渲染)移动到单独的线程总是一个好主意。
于 2013-11-10T06:51:55.763 回答