在窗口模式下使用 VSync 时 Gameloop 的问题
Problems with Gameloop when using VSync in windowed mode
我阅读了一些有关使用 SharpDX 在 C# 中进行 RenderLoop 的文章,但都存在相同的问题。
使用此循环可以很好地以 V-Sync 速率进行渲染,除非发生某些事件。
例如,拖动 window 或在 window 栏(打开菜单)上单击鼠标右键将停止循环。有办法避免这种情况吗?我想要(甚至不刷新控件)稳定的 60 FPS 循环。
我正在控件(面板)上渲染,我需要这个。
OP 现在肯定已经解决了这个问题,但是由于 3 个月后没有答案,这是我的:
当 运行 在 window 中时,不要使用 SharpDx VSync —— 这不是为了那个,肯定会导致争用和死锁。 VSync 只有在您拥有整个屏幕时才有用。
只需出示您的交换链并让 window 管理员在可能的时候显示它,您将获得您可以提供的最高帧率。
同样的事情前一段时间让我很头疼,虽然我没有在文档中的任何地方找到答案,但仔细想想就很明显:windows 管理桌面是不可能的如果每个 window 尝试独立与 VSync 协调。
bool vSync = false; // vSync should not be used in windowed modes -- may cause UI deadlocks when resizing form windows
swapChain.Present(vSync ? 1 : 0, PresentFlags.None, new PresentParameters()); // requires v11.1
我阅读了一些有关使用 SharpDX 在 C# 中进行 RenderLoop 的文章,但都存在相同的问题。 使用此循环可以很好地以 V-Sync 速率进行渲染,除非发生某些事件。 例如,拖动 window 或在 window 栏(打开菜单)上单击鼠标右键将停止循环。有办法避免这种情况吗?我想要(甚至不刷新控件)稳定的 60 FPS 循环。 我正在控件(面板)上渲染,我需要这个。
OP 现在肯定已经解决了这个问题,但是由于 3 个月后没有答案,这是我的:
当 运行 在 window 中时,不要使用 SharpDx VSync —— 这不是为了那个,肯定会导致争用和死锁。 VSync 只有在您拥有整个屏幕时才有用。
只需出示您的交换链并让 window 管理员在可能的时候显示它,您将获得您可以提供的最高帧率。
同样的事情前一段时间让我很头疼,虽然我没有在文档中的任何地方找到答案,但仔细想想就很明显:windows 管理桌面是不可能的如果每个 window 尝试独立与 VSync 协调。
bool vSync = false; // vSync should not be used in windowed modes -- may cause UI deadlocks when resizing form windows
swapChain.Present(vSync ? 1 : 0, PresentFlags.None, new PresentParameters()); // requires v11.1