Opengl 与击剑同步

Opengl 与击剑同步,opengl,opengl-4,Opengl,Opengl 4,我对使用glClientWaitSync函数有一个误解 承认我用的是这样的东西: glDraw(...); sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); glDraw(...); glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000); glDeleteSync(sync); 如果我很了解OpenGL Wiki,我们有两个案例 第一种情况:OpenGL 4.5:在

我对使用glClientWaitSync函数有一个误解

承认我用的是这样的东西:

glDraw(...);
sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
glDraw(...);
glClientWaitSync(sync, GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000);
glDeleteSync(sync);
如果我很了解OpenGL Wiki,我们有两个案例

第一种情况:OpenGL 4.5:在这种情况下,在glClientWaitSync之后,我们确定只执行第一次绘制,因为它是在wiki上编写的:

在OpenGL4.5中,此刷新是特殊的。如果这是您第一次等待特定的同步对象,并且等待与创建同步对象的上下文相同,则刷新将表现为您在同步对象之后立即发出它。因此,如果在创建同步对象后发出了其他OpenGL命令,则不会刷新这些命令

第二种情况:OpenGL 4.4或更低版本:我们确信这两种绘图都是执行的,因为此函数与glFlush函数具有“全局”相同的行为? 这样,如果所有的命令缓冲区都已刷新,那么如何在OpenGL 4.4中真正使用循环方式的持久映射?

并不意味着“已完成”。这仅仅意味着“最终将由GPU执行,而无需进一步调用OpenGL。”

4.4行为会将所有内容刷新到
glClientWaitSync
命令。4.5行为将只刷新
glFenceSync
调用之前的所有内容

但是在这两种情况下,如果
glClientWaitSync
返回时没有超时或出错,那么您所知道的关于GPU状态的唯一信息就是
glFenceSync
调用之前的所有命令都已完成

这样,如果所有的命令缓冲区都被刷新了,那么如何在OpenGL4.4中使用循环方式的持久映射呢

如果您只想刷新围栏同步,那么这就是您在4.4中必须执行的操作。也就是说,
glFlush
在创建围栏后立即刷新,但在使用
glClientWaitSync
时不刷新。这将使您获得4.5行为的效果。

并不意味着“已完成”。这仅仅意味着“最终将由GPU执行,而无需进一步调用OpenGL。”

4.4行为会将所有内容刷新到
glClientWaitSync
命令。4.5行为将只刷新
glFenceSync
调用之前的所有内容

但是在这两种情况下,如果
glClientWaitSync
返回时没有超时或出错,那么您所知道的关于GPU状态的唯一信息就是
glFenceSync
调用之前的所有命令都已完成

这样,如果所有的命令缓冲区都被刷新了,那么如何在OpenGL4.4中使用循环方式的持久映射呢


如果您只想刷新围栏同步,那么这就是您在4.4中必须执行的操作。也就是说,
glFlush
在创建围栏后立即刷新,但在使用
glClientWaitSync
时不刷新。这将为您提供4.5行为的效果。

因此,如果我理解得很清楚,以4.4方式进行冲洗将确保围栏之前的所有命令都将完成,以及围栏之后的命令是什么?以4.5的方式,后面的命令不是必须开始的?因此,如果我理解得很清楚,以4.4的方式进行冲洗将确保围栏之前的所有命令都将完成,哪些命令在后面开始?在4.5的方式中,后一个不是必须开始的?