使pygame的帧速率更快


10

通过对游戏进行性能分析,我发现我的爱好游戏的绝大部分执行时间都在blit和flip调用之间。目前,它仅以13fps的速度运行。我的显卡相当不错,所以我猜想pygame没有使用它。

有人知道我需要在pygame中设置任何图形/显示选项以使其更快吗?还是自选择pygame以来我必须忍受的东西?

Answers:


12

如果您以全屏模式运行,则可以pygame.HWSURFACE在初始化显示时使用该标志来告诉pygame尝试使用硬件表面。我相信,如果不能使用硬件表面,则pygame将默默地使用软件表面。

如果您不使用硬件表面,请考虑使用pygame.display.update(rectangle)而不是pygame.display.flip()。这只会更新给定的矩形,而不是整个显示,这可以大大提高性能,除非您的游戏实际需要更新整个显示。

如果您使用的是硬件或OpenGL表面,则还有一个pygame.DOUBLEBUF使用硬件双重缓冲的功能,这意味着您的绘图函数将绘制到两个缓冲区之一,flip()并将交换可见的缓冲区。


5

pygame的一个瓶颈实际上是字体渲染。您不应多次渲染同一文本(使用相同的字体/颜色),而应缓存一次渲染的曲面并重新使用它们。如果大量使用Font.render(),请考虑这一点。


4

除了talljosh的答案之外,我还想提出一些建议:

尽可能避免旋转和缩放。这样的操作纯粹是在CPU上完成的,而且往往非常慢。

如果您要直接进行像素读取/修改,请使用Surface.get_buffer()方法并进行处理,而不要使用Surface.set_at()/get_at()方法。


2

注释掉您拥有的任何测试控制台输出。如Cody所述,这可以大大降低帧速率,尤其是在旋转和缩放之间输出时。


2

没错,Pygame不使用视频卡的3D加速功能。这是因为它基于具有相同限制的SDL。一种选择是重写你的游戏就像一个系统pyglet原生支持OpenGL加速的精灵,找到只适用于图形相似的库,或自己编写的OpenGL代码这一点。


Pyglet很棒。
共产党鸭子

1

使用psyco是一件非常简单的事情。我不知道它会有多大帮助,但是由于它所需要的只是

 import psyco
 psyco.full()

要开始运行,您不妨尝试一下。


Psyco对于现代惯用的Python代码确实没有多大帮助。如果您需要JIT,请使用PyPy(但不确定PyGame是否在那里工作)。
coderanger 2011年

Pygame在PyPy下不起作用,但是Pyglet可以,因此您可以使用它。
coderanger 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.