Opengl 与击剑同步
我对使用glClientWaitSync函数有一个误解 承认我用的是这样的东西: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:在
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的方式中,后一个不是必须开始的?