首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法提高Python和Pygame的速度?

问有没有办法提高Python和Pygame的速度?
EN

Stack Overflow用户
提问于 2011-06-18 20:15:23
回答 6查看 28K关注 0票数 15

我正在用Pygame编写一个简单的自上而下的rpg,我发现它相当慢……虽然我不期望python或pygame能与C/C++或事件字节编译语言(如Java )等编译语言制作的游戏的FPS相媲美,但pygame目前的FPS仍为15。我尝试渲染16色位图,而不是PNG或24位图,这略微提高了速度,但无奈之下,我将所有内容都切换为黑白单色位图,这使得FPS达到35。但仅此而已。现在,根据我读过的大多数游戏开发书籍,要让用户对游戏图形完全满意,2d游戏的FPS至少应该是40,那么有什么方法可以提高pygame的速度吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-06-18 20:48:59

对于python2,请使用Psyco:

代码语言:javascript
复制
import psyco
psyco.full()

另外,启用双缓冲。例如:

代码语言:javascript
复制
from pygame.locals import *
flags = FULLSCREEN | DOUBLEBUF
screen = pygame.display.set_mode(resolution, flags, bpp)

如果不需要alpha,也可以将其关闭:

代码语言:javascript
复制
screen.set_alpha(None)

不是每次都翻转整个屏幕,而是跟踪更改的区域并只更新这些区域。例如,大致类似于以下内容(主循环):

代码语言:javascript
复制
events = pygame.events.get()
for event in events:
    # deal with events
pygame.event.pump()
my_sprites.do_stuff_every_loop()
rects = my_sprites.draw()
activerects = rects + oldrects
activerects = filter(bool, activerects)
pygame.display.update(activerects)
oldrects = rects[:]
for rect in rects:
    screen.blit(bgimg, rect, rect)

大多数(全部?)绘图函数返回一个rect。

您还可以仅设置一些允许的事件,以便更快地处理事件:

代码语言:javascript
复制
pygame.event.set_allowed([QUIT, KEYDOWN, KEYUP])

此外,我不会费心手动创建缓冲区,也不会使用HWACCEL标志,因为我在某些设置中遇到过问题。

使用这个,我已经为一个小的2D平台实现了相当好的FPS和流畅度。

票数 20
EN

Stack Overflow用户

发布于 2017-01-17 03:11:43

所有这些都是很好的建议,而且效果很好,但你也应该记住两件事:

1)将曲面分块到曲面上比直接绘制更快。因此,预先在表面上绘制固定的图像(在主游戏循环之外),然后将表面绘制到主屏幕上会更有效率。对于示例:

代码语言:javascript
复制
# pre-draw image outside of main game loop
image_rect = get_image("filename").get_rect()
image_surface = pygame.Surface((image_rect.width, image_rect.height))
image_surface.blit(get_image("filename"), image_rect)
......
# inside main game loop - blit surface to surface (the main screen)
screen.blit(image_surface, image_rect)

2)确保你不会因为绘制用户看不到的东西而浪费资源。例如:

代码语言:javascript
复制
if point.x >= 0 and point.x <= SCREEN_WIDTH and point.y >= 0 and point.y <= SCREEN_HEIGHT:
    # then draw your item

这些是一些帮助我保持高FPS的一般概念。

票数 5
EN

Stack Overflow用户

发布于 2013-03-22 03:05:55

在使用图像时,使用图像的convert()-function对其进行转换非常重要。我读到convert()禁用alpha,这通常很慢。我也有速度问题,直到我使用16位的颜色深度和转换功能为我的图像。现在我的每秒帧率是150左右,即使我在屏幕上画一张大图。

代码语言:javascript
复制
image = image.convert()#video system has to be initialed

此外,旋转和缩放也需要大量的时间来计算。如果一个大的、变换过的图像是不可变的,那么它可以保存在另一个图像中。

因此,我们的想法是计算一次,并多次重复使用结果。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6395923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档