This question already has answers here:
Can I delete a float array when I have used glBufferData?
                                
                                    (2个答案)
                                
                        
                        
                            When does OpenGL get finished with pointers in functions?
                                
                                    (1个答案)
                                
                        
                                2年前关闭。
            
                    
我需要调用glFlush(); glFinish();吗?确保在我调用glBufferData或将CPU缓冲区作为输入的类似函数之后,GPU消耗了所有CPU数据
即这样的代码保证可以正常工作而不会崩溃:

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);

最佳答案

如果需要将GL状态与主机数据或GL↔CLInterop调用同步,则必须调用glFinish。交换缓冲区时,将隐式调用此调用(或类似调用),因此在OpenGL的大多数常规用法中,无需调用它。

以我的个人经验,我使用glFinish的一种情况是当我强迫GL绘制极其图形化的图像时,渲染整个图像需要60秒钟以上的时间-在最佳情况下这会导致操作系统重置图形驱动程序并导致您的程序崩溃,在最坏的情况下,它会导致蓝屏死机,而我已经分享了其中的一部分!提交该任务通常会导致GL尝试将所有内容捆绑在一起,并且操作系统如果响应时间不超过几秒钟,通常会认为图形驱动程序已崩溃。因此,我将render循环重写为仅一次批处理图像的一小部分,其循环(或多或少)如下所示:

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的特定情况下,驱动程序会在将控制权返回给主机代码之前先缓冲数据,因此无需担心与主机的同步。

09-26 23:37
查看更多