这个问题在这里已有答案:
-
Can I delete a float array when I have used glBufferData? 2个答案
-
When does OpenGL get finished with pointers in functions? 1回答
我需要调用glFlush(); glFinish();在我调用glBufferData或以CPU缓冲区作为输入的类似函数之后,确保所有CPU数据都被GPU消耗 . 这样的代码保证在没有崩溃的情况下工作:
GLfloat* buffer = malloc(1000*sizeof(GLfloat));
doSomeCalculation(buffer);
glBindBuffer(GL_ARRAY_BUFFER, _someGlBuffer);
glBufferData(GL_ARRAY_BUFFER, 1000*sizeof(GLfloat), buffer, GL_DYNAMIC_DRAW);
// glFlush();
// glFinish(); //<<--- Is it required?
free(buffer);
1 回答
如果需要将GL状态与主机数据或GL↔CLInterop调用同步,则需要调用
glFinish
. 交换缓冲区时将隐式调用此(或类似的调用),因此在大多数OpenGL的正常使用中,不需要调用它 .根据我的个人经验,我使用
glFinish
的一个场景是当我强迫GL绘制极其图形化的图像时,渲染整个图像需要花费60秒 - 在最佳情况下,这会导致操作系统重置图形驱动程序并导致程序崩溃,在最坏的情况下它会导致蓝屏死机,并且我会响应超过几秒钟 . 所以我重写了渲染循环,只是一次批量处理图像的小部分,一个循环(或多或少)看起来像这样:因此,如果您有一个用例,您担心单个绘图调用花费的时间太长,您可以将其拆分,并防止GL通过使用
glFinish
将它们拆分为一起来对后续绘制调用进行批处理 .但我的情况非常独特 . 一般来说,你不应该期望这样做 .
编辑:
在
glBufferData
的特定情况下,驱动程序在将控制权返回给主机代码之前缓冲数据,因此无需担心与主机同步 .