performance - 如何暂时禁用 OpenGL 命令队列以获得更准确的分析结果?

标签 performance opengl asynchronous profiling opengl-3

在 Mac OS X 的 OpenGL Profiler 应用程序中,我可以获得有关每个 GL 函数调用所需时间的统计数据。然而,结果显示大量时间花费在刷新命令(glFlushglFlushRenderAPPLECGLFlushDrawable)和 glDrawElements,并且每个其他 GL 函数调用的时间都小得可以忽略不计。

我认为这是因为 OpenGL 正在对我提交的命令进行排队,并等待刷新或绘制来实际执行命令。

我想我可以做这样的事情:

glFlush();
startTiming();
glDoSomething();
glFlush();
stopTimingAndRecordDelta();

...并在我的应用程序进行的每个 GL 函数调用周围插入该模式,但这会很乏味,因为我的应用程序中有数千个 GL 函数调用,而且我必须手动将结果制成表格(而不是使用已经存在的 OpenGL Profiler 工具)。

那么,有没有办法禁用所有 OpenGL 命令队列,以便我可以获得更准确的分析结果?

最佳答案

So, is there a way to disable all OpenGL command queueing, ...

不,没有 OpenGL 函数可以做到这一点。

..., so I can get more accurate profiling results?

您可以获得比当前更准确的信息,但您永远不会获得真正精确的答案(但您可能可以获得您需要的东西)。虽然 OpenGL 渲染的结果是“相同的”——OpenGL 不能保证跨实现的像素精确度——但它们应该非常接近。然而,像素的生成方式可能会有很大差异。特别是,平铺渲染器(在移动和嵌入式设备中)通常不会在绘制调用期间渲染像素,而是对几何体进行排队,并在缓冲区交换时生成像素。

也就是说,为了分析 OpenGL,您需要使用 glFinish,而不是 glFlushglFinish 将强制所有挂起的 OpenGL 调用完成并返回; glFlush 只是请求“在未来的某个时间”将命令发送到 OpenGL,因此它不是确定性的。请务必删除“生产”代码中的 glFinish,因为它确实会减慢应用程序的速度。从您的示例中,如果您将示例中的冲水替换为饰面,您将获得更多有趣的信息。

关于performance - 如何暂时禁用 OpenGL 命令队列以获得更准确的分析结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20570684/

相关文章:

performance - 如何提高 cassandra 中的插入性能?

javascript - 多个 AJAX 调用请求 JSONP 的问题

Javascript : Scoping in Asynchronous Execution (using Callbacks)

javascript/react - 异步/等待 for 循环 POST 请求

python - 使用最少的内存/CPU 对 3D 数据网格进行矩阵运算

Mysql innodb 查询返回缓慢结果

c++ - 在 C++ 中嵌入汇编器可以接受吗?

c++ - GLFW 窗口只显示清晰的颜色,没有其他

opengl - 渐变色文本

opengl - 查找 3d 点之间的旋转角度