- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
运行有区别吗
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);
(代码取自 Lighthouse3d.com )。
另一种选择是将 glBeginQuery
与 GL_TIME_ELAPSED
参数一起使用,链接文章中也对此进行了描述。
关于c++ - glFinish() 与 glFenceSync() + glClientWaitSync(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34265366/
我使用带有 GL_MAP_UNSYNCHRONIZED_BIT 的 glMapBufferRange 来映射缓冲区对象。然后我将返回的指针传递给工作线程以异步计算新顶点。对象是双重缓冲的,因此我可以在
在我的渲染引擎中,我使用 glMapSubBuffer 以及孤立和栅栏实现了三重缓冲来更新着色器缓冲区。在 Windows 中一切正常,但当我在 Mac 上运行引擎时出现问题。当我调用 glClien
运行有区别吗 glFinish() 正在运行 glFenceSync(...) glClientWaitSync(...) 超时时间长吗? 我正在尝试做的事情:我运行一个 OpenGL 命令管道,我想
我不清楚 Sync objects 上的 OpenGL 规范,是否使用 glGetSynciv 或 glClientWaitSync 以防我想在不等待的情况下检查同步对象的信号。以下两个命令在行为和性
我是一名优秀的程序员,十分优秀!