C++ glFinish()与glFenceSync()和#x2B;glClientWaitSync()
跑步和跑步有区别吗C++ glFinish()与glFenceSync()和#x2B;glClientWaitSync(),c++,opengl,C++,Opengl,跑步和跑步有区别吗 glFinish() 跑步 glFenceSync(...) glClientWaitSync(...) 有一个大的暂停 我想做的是:我运行OpenGL命令的管道,我想计算每个命令需要多长时间。如果没有上述任何命令,所有内容都将被管道化/缓冲,看起来好像最后一个命令占用了所有处理时间 timer start Run Opengl part 1 sync / glFinish timer measure Run Opengl part 2 sync / glFini
glFinish()
跑步
glFenceSync(...)
glClientWaitSync(...)
有一个大的暂停
我想做的是:我运行OpenGL命令的管道,我想计算每个命令需要多长时间。如果没有上述任何命令,所有内容都将被管道化/缓冲,看起来好像最后一个命令占用了所有处理时间
timer start
Run Opengl part 1
sync / glFinish
timer measure
Run Opengl part 2
sync / glFinish
timer measure
...
因此,我试图找出如何最好地测量各个部分的“速度”,而不会对整个运行时间产生太大影响。您提到的所有选项都会影响应用程序的性能,因为它们会使管道暂停。在OpenGL中测量时间的现代方法是使用计时器查询:您告诉OpenGL在GPU上执行查询时应该保存时间戳,因此GPU和CPU之间不需要同步。例如,代码可以如下所示:
GLuint64 startTime, stopTime;
unsigned int queryID[2];
// generate two queries
glGenQueries(2, queryID);
...
// issue the first query
// Records the time only after all previous
// commands have been completed
glQueryCounter(queryID[0], GL_TIMESTAMP);
// call a sequence of OpenGL commands
...
// issue the second query
// records the time when the sequence of OpenGL
// commands has been fully executed
glQueryCounter(queryID[1], GL_TIMESTAMP);
...
// get query results
// (automatically blocks until results are available)
glGetQueryObjectui64v(queryID[0], GL_QUERY_RESULT, &startTime);
glGetQueryObjectui64v(queryID[1], GL_QUERY_RESULT, &stopTime);
printf("Time spent on the GPU: %f ms\n", (stopTime - startTime) / 1000000.0);
(代码取自)
另一个选项是将
glBeginQuery
与GL\u TIME\u appeased
参数一起使用,这在链接文章中也有描述。可能希望至少在循环中抛出一个sleep
,这样它就不会占用您所有的CPU。不需要旋转循环等待结果的可用性。如果结果还不可用,获取GL\u QUERY\u结果将被阻止。这通常是不可取的。我想我还没有看到任何使用计时器查询的生产代码能够做到这一点。任何时候需要性能计时信息时,都不需要更改暂停导致的管道行为,直到结果可用为止。这就像加速0-60,反复刹车回到0,并期望这代表正常驾驶条件。滚动起动更能代表典型性能,但其结果却大不相同。