PyOpenGL + Pygame 全屏锁定在 60 FPS
我现在正在用pygame开发一个游戏引擎,想要加上OpenGL的支持。
我写了一个测试,看看pygame和OpenGL怎么一起工作。在窗口模式下运行时,帧率在150到200之间。但是当我切换到全屏模式(我只是加了一个FULLSCREEN的标志来设置窗口)时,帧率降到了60。我还添加了很多绘图功能,想看看是不是性能大幅下降,但无论怎么做,帧率始终保持在60。
我需要做些什么额外的设置来告诉OpenGL它正在全屏运行,还是说这是OpenGL的一个限制呢?
(我是在Windows XP上运行的)
3 个回答
如果你在切换全屏和窗口模式时没有调整你的 clock.tick(),那么这很可能是一个垂直同步(vsync)的问题。如果你使用的是液晶显示器,那就几乎可以肯定了。
不幸的是,垂直同步可以在很多地方进行设置,包括 SDL、Pyopengl、你的显示服务器和视频驱动程序。如果你使用的是 Windows 系统,可以在 NVIDIA 控制面板中调整 vsync 的开关来进行测试,Linux 系统的 NVIDIA 设置中也很可能有类似的选项。我猜其他品牌的驱动程序也有类似的设置,但这只是我的猜测。
这是一个垂直同步(V-Sync)的问题吗?可能是你的设置或环境有什么限制,把最高的帧率限制到了你显示器的刷新率。
正如frou提到的,这个问题是因为Pygame在你调用display.flip()
更新屏幕时,会等待垂直回扫。根据Pygame的display
文档,如果你在设置显示模式时使用了HWSURFACE
或DOUBLEBUF
标志,display.flip()
会在交换缓冲区之前等待垂直回扫。
老实说,我觉得没有什么好的理由(除了做性能测试)去追求比屏幕刷新率更快的帧率。你(还有玩你游戏的人)根本不会感觉到速度或性能有什么不同,因为显示器最多只能显示60帧每秒。而且,如果你不和垂直回扫同步,很可能会出现画面撕裂的问题。