我很难区分调用glFlush()
和glFinish()
之间的实际区别。
文档中说,glFlush()
和glFinish()
会将所有缓冲的操作推送到OpenGL,这样就可以确保它们都会被执行,不同之处在于glFlush()
会立即返回where作为glFinish()
块,直到所有操作完成。
读完定义后,我认为如果我要使用glFlush()
,我可能会遇到向OpenGL提交的操作超过它所能执行的操作的问题。所以,为了尝试一下,我把我的glFinish()
换成了glFlush()
,你瞧,我的程序运行起来(据我所知),完全一样;帧率,资源使用,一切都是一样的。
所以我想知道这两个调用之间是否有很大的不同,或者我的代码使它们运行起来没有什么不同。或者其中一个应该用来对抗另一个。我还认为OpenGL会有一些像glIsDone()
这样的调用来检查glFlush()
的所有缓冲命令是否都是完整的(因此,向OpenGL发送操作的速度不会快于它们的执行速度),但我找不到这样的函数。
我的代码是典型的游戏循环:
while (running) {
process_stuff();
render_stuff();
}
发布于 2010-01-27 20:14:42
如果您没有看到任何性能差异,这意味着您正在做一些错误的事情。正如其他一些人提到的,你也不需要调用,但是如果你调用了glFinish,那么你就会自动失去GPU和CPU所能实现的并行性。让我深入探讨一下:
在实践中,您提交给驱动程序的所有工作都是批处理的,并可能在以后以某种方式发送到硬件(例如在SwapBuffer时间)。
因此,如果你在调用glFinish,你实际上是在强迫驱动程序将命令推送到图形处理器(在此之前,它会对其进行批处理,并且从未要求图形处理器工作),并停止CPU,直到推送的命令完全执行。所以在GPU工作的整个过程中,CPU不工作(至少在这个线程上)。在CPU执行其工作的所有时间(主要是批处理命令),GPU什么也不做。所以,glFinish应该会影响你的表现。(这是一个近似值,因为如果许多命令已经被批处理,驱动程序可能会开始让GPU处理一些命令。但这并不典型,因为命令缓冲区往往足够大,可以容纳相当多的命令)。
那么,你为什么要调用glFinish呢?我使用它的唯一一次是当我有驱动程序错误的时候。实际上,如果您发送给硬件的命令之一使GPU崩溃,那么识别哪个命令是罪魁祸首的最简单的选择就是在每次绘制之后调用glFinish。这样,您就可以缩小到底是什么触发了崩溃
顺便说一句,像Direct3D这样的API根本不支持Finish概念。
发布于 2012-05-22 09:38:28
glFlush实际上可以追溯到客户机-服务器模型。您通过管道将所有gl命令发送到gl服务器。那根管子可能会缓冲。就像任何可能缓冲的文件或网络i/o一样。glFlush只说“立即发送缓冲区,即使它还没有满!”。在本地系统上,这几乎是不需要的,因为本地OpenGL应用程序接口不太可能缓冲自己,而只是直接发出命令。此外,所有导致实际渲染的命令都将执行隐式刷新。
另一方面,glFinish是用于性能测量的。类似于对GL服务器的PING。它往返一条命令并等待,直到服务器响应“我空闲”。
如今,当地的司机对无所事事的含义有相当创造性的想法。是“所有像素都已绘制”还是“我的命令队列有空间”?此外,由于许多旧程序将glFlush和glFinish无缘无故地散布在其代码中,因此许多现代驱动程序只是忽略它们,将其视为“优化”。这不能怪他们,真的。
因此,总而言之:在实践中,将glFinish和glFlush都视为无操作,除非您正在为一个古老的远程SGI OpenGL服务器编写代码。
https://stackoverflow.com/questions/2143240
复制相似问题