在 Mac OS X 的 OpenGL Profiler 应用程序中,我可以获得有关每个 GL 函数调用所需时间的统计数据。然而,结果显示大量时间花费在刷新命令(glFlush
、glFlushRenderAPPLE
、CGLFlushDrawable
)和 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
,而不是 glFlush
。 glFinish
将强制所有挂起的 OpenGL 调用完成并返回; glFlush
只是请求“在未来的某个时间”将命令发送到 OpenGL,因此它不是确定性的。请务必删除“生产”代码中的 glFinish
,因为它确实会减慢应用程序的速度。从您的示例中,如果您将示例中的冲水替换为饰面,您将获得更多有趣的信息。
关于performance - 如何暂时禁用 OpenGL 命令队列以获得更准确的分析结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20570684/