eglSwapInterval(0) 会导致屏幕撕裂吗?
Can eglSwapInterval(0) cause screen tearing?
当我阅读那些文档中的 eglSwapInterval() api 时 (https://www.khronos.org/registry/egl/sdk/docs/man/html/eglSwapInterval.xhtml, https://www.opengl.org/wiki/Swap_Interval)。
当我用零值调用 eglSwapInterval() 时,eglSwapBuffers() 调用将交换前后缓冲区,而无需等待 vblank。
这意味着缓冲区交换可以随时发生。
那么,这会导致屏幕撕裂吗?
或者在这种情况下,在 vsync 脉冲期间也阻止了缓冲区交换?
是的。零交换间隔指定您要立即交换,而无需等待垂直同步。如果这是您的 EGL 实现实际执行的操作,它将导致撕裂。来自 EGL spec:
If interval is set to a value of 0, buffer swaps are not synchronized to a video frame, and the swap happens as soon as all rendering commands outstanding for the current context are complete. interval is silently clamped to minimum and maximum implementation dependent values before being stored; these values are defined by EGLConfig attributes EGL_MIN_SWAP_INTERVAL
and EGL_MAX_SWAP_INTERVAL
respectively.
正如规范所建议的那样,您实际上可能不会获得零交换间隔(如果不这样做,您就不会撕裂)。这取决于您的 EGL 实现是否支持零交换间隔(您可以查询配置以找出),以及底层窗口系统是否支持它。
当我阅读那些文档中的 eglSwapInterval() api 时 (https://www.khronos.org/registry/egl/sdk/docs/man/html/eglSwapInterval.xhtml, https://www.opengl.org/wiki/Swap_Interval)。 当我用零值调用 eglSwapInterval() 时,eglSwapBuffers() 调用将交换前后缓冲区,而无需等待 vblank。 这意味着缓冲区交换可以随时发生。 那么,这会导致屏幕撕裂吗?
或者在这种情况下,在 vsync 脉冲期间也阻止了缓冲区交换?
是的。零交换间隔指定您要立即交换,而无需等待垂直同步。如果这是您的 EGL 实现实际执行的操作,它将导致撕裂。来自 EGL spec:
If interval is set to a value of 0, buffer swaps are not synchronized to a video frame, and the swap happens as soon as all rendering commands outstanding for the current context are complete. interval is silently clamped to minimum and maximum implementation dependent values before being stored; these values are defined by EGLConfig attributes
EGL_MIN_SWAP_INTERVAL
andEGL_MAX_SWAP_INTERVAL
respectively.
正如规范所建议的那样,您实际上可能不会获得零交换间隔(如果不这样做,您就不会撕裂)。这取决于您的 EGL 实现是否支持零交换间隔(您可以查询配置以找出),以及底层窗口系统是否支持它。