pyglet 在 Windows 上交换前后缓冲区(`flip()`,OpenGL 的 wglSwapLayerBuffers 的包装器)的方式可能会慢 100 倍

The way pyglet swaps front and back buffers (`flip()`, wrapper for OpenGL's wglSwapLayerBuffers) on Windows can be 100 times too slow

出乎意料(虽然我可能错过了一些自动更新),我的 P.C 上的 pyglet 的 flip() 方法。变得慢了大约 100 倍(我的脚本从大约 20 到 0.2 FPS,分析显示 flip() 是罪魁祸首)。

我不完全理解这一点,但由于我的 OS 是 windows 10,该方法似乎只是 运行 wglSwapLayerBuffers OpenGL double 的一种方法-python 中的缓冲周期。其他一切似乎都具有正常速度,包括使用 OpenGL 的程序。这以前发生过,重启后自行修复,所以当时我并没有深入研究。

现在,重新启动不会改变任何东西。我更新了我的 GPU 驱动程序,我尝试禁用垂直同步,我寻找可能使用大量内存 and/or GPU 内存的无关进程。我重新安装了最新稳定版的pyglet。

现在我什至不知道如何开始对此进行故障排除...

这是一个最小的例子,它打印 0.2s 而不是 20s。

from pyglet.gl import *

def timing(dt):
    print(1/dt)

game_window = pyglet.window.Window(1,1)

if __name__ == '__main__':
    pyglet.clock.schedule_interval(timing, 1/20.0)
    pyglet.app.run()

(在 pyglet.app.run() 内,分析显示 flip() 方法基本上一直都在使用。

编辑:我的真实脚本使用 pyglet 显示经常更新的图像,不会导致 GPU 使用率增加(我还检查了随机程序(即 Minecraft)的效果以确保我使用的 GPU 监控工具有效,它确实会导致增加)。我认为这排除了由于一些不相关的问题我没有足够的可用计算能力的可能性。

好的,我在这个 google 小组讨论中找到了解决我的问题的方法,该对话使用相同的方法讨论不同的问题:https://groups.google.com/forum/#!topic/pyglet-users/7yQ9viOu75Y( claudio canepa 的回复中建议的更改,即将 flip() link 更改为相同功能的 GDI 版本而不是 wglSwapLayerBuffers,使事情恢复正常)。

我仍然不确定为什么 wglSwapLayerBuffers 在我的情况下表现得如此奇怪。我想像我这样的问题是 GDI 版本为 "recommended" 的部分原因。然而,理解为什么我的问题甚至可能发生仍然会很好,如果有人知道发生了什么......并且不得不干预一个相对可靠和受人尊敬的库只是为了执行其最基本的任务之一感觉真的非常脏,必须有是一个更明智的解决方案。