我已经花费了几年的时间来尝试解决这个问题/行为。像Avorion和Beyond All Reason这样的游戏都会受到它的影响,并且有许多未解决的问题/帖子。 我把这个留在这里,希望未来的某个人会偶然发现它。
我在这些游戏中看到的一致行为
-
在切换到或从游戏切换回监视器时,监视器会闪烁,或类似地通过点击一个不同的窗口来改变焦点。
-
截图是“陈旧”的——如果你在游戏中按下“打印屏幕”,捕获的帧是你上次切换到游戏的时间。 (这并不适用于任何在游戏内截图功能,如通过Steam截图)
-
如果启用Windows HDR,效果会更糟糕——闪烁和截图问题是可容忍的,但如果你像我一样,有一个需要在HDR和标准模式之间切换的监视器,并且在Windows中启用了HDR,那么闪烁会变成3-5秒的等待。
TL;DR NVIDIA用户的工作绕过
打开NVIDIA控制面板,转到管理3D设置-程序设置,选择特定的游戏,并将“Vulkan/OpenGL呈现方法”设置从“自动”更改为“prefer层次在DXGI swapchain上”。对于BAR,我必须将此设置作为全局默认值(我猜它会运行一些辅助exe,我没去检查)
对游戏开发者来说:
Gemini flash 3.5告知我上面的绕过方法(我已经问过AI几次年,是否可以解决这个问题)。我让Opus生成一个错误报告,并检查了它们。 我相信它不是100%准确,但希望这个有足够的线索,让开发者读者能够找到解决自己的游戏问题的正确地方:
根源:引擎通过legacy OpenGL blit/
wglSwapBuffers路径呈现。 当无边框窗口与输出尺寸完全匹配时,操作系统/驱动程序会将其提升为独立翻转/直接扫描输出,但GL WSI路径无法进入/退出该状态平滑地 —— 所以每次焦点变化都会触发平面/显示重配置(可见闪烁;在HDR下,完整颜色空间/显示状态重新协商;并且一个冻结的DWM重定向表面,这就是为什么外部截图会陈旧)。真正的修复 —— 通过DXGI翻转模型swapchain呈现:继续在OpenGL中渲染,但将最终帧交付给一个D3D11/DXGI 翻转模型 swapchain (
DXGI_SWAP_EFFECT_FLIP_DISCARD),通过WGL_NV_DX_interop2。 这给了你平滑的组合↔独立翻转转换,native GL所缺乏的 —— 清洁的alt-tab,没闪烁,正确的HDR/SDR共存,以及正常的截图。 这正是NVIDIA的“prefer层次在DXGI Swapchain上”的驱动 shim自动执行的;在引擎中实现它使得修复 厂商无关 (AMD/Intel用户今天没有等价的开关,因此他们被困住,直到在引擎中解决这个问题)。廉价的中期缓解措施(如果交互工作量大): 只有当窗口完全覆盖输出时才会触发促进。 使无边框窗口 不 与监视器尺寸完全匹配(例如,1像素高于监视器),驱动程序的促进他uristic不会触发 —— DWM继续正常的组合它,没闪烁。 代价约为1帧的延迟。 注:仅仅改变窗口 样式(例如
WS_POPUP→WS_OVERLAPPED) 不是可靠的触发器 —— 质量是由全输出覆盖驱动的,因此尺寸方法是可靠的。SDL2 / Spring-Recoil注释(BAR): 确认无边框模式使用
SDL_WINDOW_FULLSCREEN_DESKTOP(真正的无边框),而不是SDL_WINDOW_FULLSCREEN(真实模式更改)。 DXGI-交互呈现可以在SDL的GL窗口后面。
评论 (0)