Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ glFinish()与glFenceSync()和#x2B;glClientWaitSync()_C++_Opengl - Fatal编程技术网

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,并期望这代表正常驾驶条件。滚动起动更能代表典型性能,但其结果却大不相同。