为什么我的Windows应用程序/游戏在Intel GPU上运行时上限为30FPS?

时间:2018-10-22 23:14:49

标签: graphics driver intel frame-rate

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

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

由于它非常基础,因此该应用程序可以在具有集成式Intel HD Graphics 630 GPU的第八代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,所以我很肯定这是Intel驱动程序的预期行为,可能是为了游戏(玩家更喜欢稳定的30FPS,而不是使游戏看起来不规则/偶尔掉落的帧)断断续续)。

但是,在我们的情况下,偶尔丢帧并不是什么大问题,但是将帧数限制为30FPS会使我们的UI和交互变得不那么令人愉悦,尤其是当它可以轻松地以平滑的60FPS渲染时。

有什么方法可以改变驾驶员的行为,而宁愿偶尔掉落推60FPS而不是将其限制在30FPS?

2 个答案:

答案 0 :(得分:1)

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

从简单的解决方案开始:在Intel HD Graphics Control Panel应用程序中,转到“ 3D”,然后转到“应用程序设置”。首先,需要为创建OpenGL窗口的过程选择磁盘上的文件,以创建应用程序配置文件。完成后,您要调整的设置是“垂直同步”。默认情况下,选择“使用应用程序默认设置”。这是导致上限为30FPS的设置。选择“使用驱动程序设置”来禁用该行为,并始终以60FPS为目标:

Intel HD Graphics Control Panel screenshot

如果不是因为英特尔糟糕的术语选择和令人费解的文档,这应该很明显。对我来说,设置的选择似乎是相反的:我希望在选择“使用驱动程序设置”时出现上限,这意味着驱动程序可以自由调整缓冲区交换,只要它认为合适即可。同样,“使用应用程序默认设置”意味着应用程序决定何时推送帧,这与设置的相反。即使是应用程序中的小气泡也似乎与这些设置的功能相矛盾...

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

答案 1 :(得分:0)

如果您的驱动程序未公开Intel HD控制面板(例如,Surface Book和其他Surface笔记本电脑上使用的驱动程序),或者您要通过regedit以编程方式进行修复,则这是基于注册表的答案。 .exe或Win32 API:

由Intel HD控制面板创建的应用程序配置文件使用具有过程文件名(例如HKCU\Software\Intel\Display\igfxcui\3D)和536字节数据的REG_BINARY值保存在my_game.exe下的注册表中Blob如下划分:

  • 字节0-3:各向异性过滤(0 =使用应用默认设置,2-10 =乘数设置)
  • 字节4-7:垂直同步(0 =使用默认应用,1 =使用驱动程序设置)
  • 字节8-11:MSAA(0 =使用应用默认设置,1 =强制关闭)
  • 字节12-15:CMAA(0 =使用应用默认设置,1 =覆盖,2 =增强)
  • 字节16-535:应用程序显示名称(宽字符,用于控制面板的应用程序列表)

注意:所有值都存储在little-endian中

此外,您需要确保同一键下的Global值的第一个字节设置为1,这是一种全局切换。(添加一个或多个条目时,控制面板会将其设置为1。到应用程序列表,然后从列表中删除最后一个条目时返回零。

值的格式也是8个字节的REG_BINARY值,如下所示:

  • 字节0-3:应用程序条目的全局切换(0 =无条目,1 =条目)
  • 字节4-7:最佳应用模式(0 =启用,1 =禁用)

例如:

enter image description here