首页 > 解决方案 > 为什么我的 Windows 应用程序/游戏在英特尔 GPU 上运行时的上限为 30FPS?

问题描述

我正在开发一个中等图形密集型的全屏 Windows 桌面应用程序,它使用 OpenGL,但只呈现 2D 内容。没什么特别的,主要是将像素推送到屏幕(最高 4K,单显示器)并上传纹理。我们使用 VSync 来控制渲染帧率,即。在渲染结束时调用 SwapBuffers() 以阻塞直到下一个 VBlank。

我们的主要要求是应用程序以稳定的 60FPS 运行,因为它与触摸屏一起使用,并且交互需要尽可能流畅。

因为它非常基础,所以该应用程序在带有集成 Intel HD Graphics 630 GPU 的第 8 代 Intel i7 CPU 上运行良好。CPU 或 GPU 都没有接近峰值使用率,我们可以通过我们的应用内 FPS 仪表看到我们正在达到舒适的 60FPS。我还在配备 Intel i7 和集成 Intel UHD Graphics 620 GPU 的 Surface Book 2 上运行它,结果相似。

然而,我最近开始注意到应用程序有时会开始下降到 30FPS,然后长时间停留在那里,有时甚至永久停留在那里。通过我们的 FPS 计,我可以看出我们实际上并没有花费任何时间进行渲染,只是我们的 SwapBuffers() 调用任意阻塞了 2 帧,将我们限制在 30FPS。回到 60FPS 的唯一方法是使用另一个应用程序使用 alt-tab 并返回到我们的应用程序,或者只是打开 Windows 菜单然后返回应用程序。

由于应用程序之后会回到 60FPS,我很肯定这是英特尔驱动程序的预期行为,可能是为了游戏(游戏玩家更喜欢稳定的 30FPS,而不是不规则/偶尔的丢帧,这会使游戏看起来不稳定)。

然而在我们的例子中,偶尔掉帧并不是什么大问题,但是被限制在 30FPS 会使我们的 UI 和交互变得不那么令人赏心悦目,尤其是当它可以轻松地以平滑的 60FPS 渲染时。

有什么方法可以将驱动程序的行为切换为更喜欢推动 60FPS 偶尔下降而不是限制在 30FPS?

标签: graphicsdriverintelframe-rate

解决方案


好的,所以我能够通过一些调整和逆向工程来解决这个问题:答案是,是的,这是英特尔驱动程序的预期但不幸的默认行为,它可以通过英特尔高清显卡控制面板修复应用程序(如果可用),或者直接在注册表中(这是解决 Surface Book 和其他 Surface 设备上的问题的唯一方法,其中自定义英特尔驱动程序不再公开英特尔高清显卡控制面板应用程序)。

从简单的解决方案开始:在英特尔核芯显卡控制面板应用程序中,转到“3D”,然后转到“应用程序设置”。您首先需要创建一个应用程序配置文件,方法是为创建 OpenGL 窗口的进程选择磁盘上的文件。完成后,您要调整的设置是“垂直同步”。默认情况下,选择“使用应用程序默认设置”。这是导致上限为 30FPS 的设置。选择“使用驱动程序设置”来禁用该行为并始终以 60FPS 为目标:

英特尔核芯显卡控制面板截图

如果不是因为英特尔可怕的术语选择和难以理解的文档,这应该很明显。对我来说,设置的选择似乎是颠倒的:我希望当我选择“使用驱动程序设置”时会发生上限,这意味着驱动程序可以自由地调整它认为合适的缓冲区交换。同样,“使用应用程序默认设置”意味着应用程序决定何时推送帧,这与设置的作用正好相反。即使应用程序中的小帮助气泡似乎与这些设置的作用相矛盾......

ps:我将在单独的答案中发布基于注册表的解决方案以保持简短


推荐阅读