【发布时间】:2015-05-18 18:19:19
【问题描述】:
我有一个带有 win32 api 的 OpenGL 应用程序,没有 glut 等……我遇到了全屏屏幕撕裂的问题。
基本上我已将WS_POPUP 设置为窗口样式,并将显示器的分辨率设置为窗口大小。
我在 AMD radeon HD 7770 上运行,我看到可怕的撕裂!
当我使用WS_POPUPWINDOW 样式而不是WS_POPUP 时,撕裂消失了,但是我的场景周围有不需要的边框。
我注意到的另一件事是事实,当分辨率不是本机时,撕裂消失了。
因此,当我将my_screen_resolution + 1 作为尺寸参数传递时,撕裂就消失了。
RESx = 1920;
RESy = 1080;
hwnd = CreateWindowEx(NULL, NAME, NAME, WS_POPUP, 0, 0, RESx, RESy, NULL, NULL, hInstance, NULL);
SetWindowPos(hwnd, 0, -1, -1, RESx + 1, RESy + 1, 0); // With this function call, the tearing disappears!
我可以做些什么来摆脱撕裂而不必在非原生分辨率上运行?
编辑:(提示:这不是垂直同步)
【问题讨论】:
-
我不认为你可以避免 vsync 来摆脱撕裂。另一方面,有很多潜在的解决方案可以限制输入滞后。例如,以 300 fps 运行您的应用程序逻辑,但仅以 60 fps 绘制它。尝试用谷歌搜索更多细节(或者在这里问另一个问题)。
-
我正在以 60FPS 的速度更新内容,并尽可能地利用最大值(我得到大约 600FPS)。我知道,我可以避免撕裂,因为我帖子中的最后一个函数 (
SetWindowPos(hwnd, 0, -1, -1, RESx + 1, RESy + 1, 0);) 做到了这一点。但是我认为这不是一个合适的解决方案。 -
“提示:这不是垂直同步”...嗯,谢谢你的提示,但它实际上是垂直同步。垂直同步的全部目的是防止撕裂。这就是它所做的一切。垂直同步没有任何其他用途。
-
@DietrichEpp 不,这只是一个古怪问题的解决方案。仅仅因为 vsync 是为了防止撕裂,而撕裂是他的问题,并不一定意味着你需要 vsync 来修复它。因为我可以通过使用 width+1 来解决这个问题并且没有撕裂。我可以设置具有宽度的视口,完全没有问题。不需要垂直同步。为什么只有当它映射到确切的屏幕时才会撕裂?一个实际的原因(答案)可能是它运行得更快,映射到确切的分辨率?因此 vsync 可能是解决这个问题的唯一方法?
-
@Puddle:使用 width+1 你可能会通过合成器,也许这会给你垂直同步。
标签: c++ windows opengl fullscreen tearing