我正在用Pygame编写一个简单的自上而下的rpg,我发现它相当慢……虽然我不期望python或pygame能与C/C++或事件字节编译语言(如Java )等编译语言制作的游戏的FPS相媲美,但pygame目前的FPS仍为15。我尝试渲染16色位图,而不是PNG或24位图,这略微提高了速度,但无奈之下,我将所有内容都切换为黑白单色位图,这使得FPS达到35。但仅此而已。现在,根据我读过的大多数游戏开发书籍,要让用户对游戏图形完全满意,2d游戏的FPS至少应该是40,那么有什么方法可以提高pygame的速度吗?
发布于 2011-06-18 20:48:59
对于python2,请使用Psyco:
import psyco
psyco.full()另外,启用双缓冲。例如:
from pygame.locals import *
flags = FULLSCREEN | DOUBLEBUF
screen = pygame.display.set_mode(resolution, flags, bpp)如果不需要alpha,也可以将其关闭:
screen.set_alpha(None)不是每次都翻转整个屏幕,而是跟踪更改的区域并只更新这些区域。例如,大致类似于以下内容(主循环):
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。
您还可以仅设置一些允许的事件,以便更快地处理事件:
pygame.event.set_allowed([QUIT, KEYDOWN, KEYUP])此外,我不会费心手动创建缓冲区,也不会使用HWACCEL标志,因为我在某些设置中遇到过问题。
使用这个,我已经为一个小的2D平台实现了相当好的FPS和流畅度。
发布于 2017-01-17 03:11:43
所有这些都是很好的建议,而且效果很好,但你也应该记住两件事:
1)将曲面分块到曲面上比直接绘制更快。因此,预先在表面上绘制固定的图像(在主游戏循环之外),然后将表面绘制到主屏幕上会更有效率。对于示例:
# 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)确保你不会因为绘制用户看不到的东西而浪费资源。例如:
if point.x >= 0 and point.x <= SCREEN_WIDTH and point.y >= 0 and point.y <= SCREEN_HEIGHT:
# then draw your item这些是一些帮助我保持高FPS的一般概念。
发布于 2013-03-22 03:05:55
在使用图像时,使用图像的convert()-function对其进行转换非常重要。我读到convert()禁用alpha,这通常很慢。我也有速度问题,直到我使用16位的颜色深度和转换功能为我的图像。现在我的每秒帧率是150左右,即使我在屏幕上画一张大图。
image = image.convert()#video system has to be initialed此外,旋转和缩放也需要大量的时间来计算。如果一个大的、变换过的图像是不可变的,那么它可以保存在另一个图像中。
因此,我们的想法是计算一次,并多次重复使用结果。
https://stackoverflow.com/questions/6395923
复制相似问题