我需要调用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);
答案 0 :(得分:2)
glFinish
。交换缓冲区时将隐式调用此(或类似的调用),因此在大多数OpenGL的正常使用中,不需要调用它。
根据我的个人经验,我使用glFinish
的一个场景是当我强迫GL绘制极其图形化的图像时,渲染整个图像的时间超过60秒 - 在最佳情况下导致操作系统重置图形驱动程序并导致程序崩溃,在最坏的情况下会导致蓝屏死机,而且我已经分享了这些!正常提交该任务会导致GL尝试将所有内容捆绑在一起,并且操作系统通常会假设图形驱动程序已经崩溃,如果它没有响应超过几秒钟。所以我重写了渲染循环,只是一次批处理图像的一小部分,一个(或多或少)的循环看起来像这样:
for(int x = 0; x < image_width; x += 32) {
for(int y = 0; y < image_height; y += 32) {
glViewport(x, y, 32, 32);
glDrawArrays(GL_QUADS, 0, 4);
glFinish();
}
}
因此,如果您有一个用例,您担心个别绘制调用花费的时间太长,您可以将其拆分,并防止GL将后续绘制调用一起打包,将它们与使用分开glFinish
。
但我的情况非常独特。一般来说,你不应该期望这样做。
在glBufferData
的特定情况下,驱动程序在将控制权返回给主机代码之前缓冲数据,因此无需担心与主机同步。