【问题标题】:Is there a way to tell whether an OpenGL operation is finished?有没有办法判断 OpenGL 操作是否完成?
【发布时间】:2013-08-14 03:43:09
【问题描述】:

OpenGL 函数被定义为好像它们是同步操作的。但是渲染函数(和其他函数)通常会由 GPU 异步执行。 OpenGL 将有效地隐藏这一点:如果您执行需要操作结果的操作(例如从已渲染到的帧缓冲区中读取),OpenGL 将停止 CPU 操作,直到 GPU 达到该点。

这是功能性的,但对于性能来说并不理想,因为 CPU 基本上会阻塞,直到 GPU 完成。有没有办法确定一个特定的操作是否已经完成,这样你就知道在没有那么多 CPU 阻塞的情况下将执行一个依赖操作?

【问题讨论】:

    标签: opengl asynchronous


    【解决方案1】:

    是的,有。假设您可以访问 OpenGL 3.2+ 或 ARB_sync 扩展。

    如果您想知道特定命令何时完成,您可以在发出该命令后立即将“栅栏”sync object 插入命令流。这是通过glFenceSync function 完成的。

    您必须存储此函数返回的指针。有了这个指针,您可以通过检查围栏是否使用glGetSync function 发出信号来查询围栏是否已完成。像这样:

    GLint isSignaled = 0;
    glGetSync(syncObj, GL_SYNC_STATUS, 1, NULL, &isSignaled);
    
    if(isSignaled == GL_SIGNALED)
    {
      //Prior commands have completed.
    }
    else
    {
      //Not done yet.
    }
    

    如果你没有其他事情要做,你不需要等待同步对象完成;你可以做任何你想做的OpenGL过程。这将导致你的 CPU 阻塞。

    完成同步对象后,必须将其删除。使用glDeleteSync function 来执行此操作。

    【讨论】:

    • 很好的问题。但是可以同时提问和回答吗? ;) 另外,这样的同步检查不会给管道增加更多不必要的开销吗?
    • @MichaelIV:“但可以同时提问和回答吗?”是的。这就是为什么当你问一个问题时,底部有一个框,可以让你在提问之前就在那里回答。至于增加“不必要的开销”,围栏预计会相当轻。内部驱动程序进程一直使用栅栏,以便它们可以告诉您何时完成了缓冲区对象等等。
    猜你喜欢
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2023-01-14
    • 2011-10-01
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多