.png 使 pygame 变得迟钝
Posted
技术标签:
【中文标题】.png 使 pygame 变得迟钝【英文标题】:.png make pygame laggy 【发布时间】:2017-03-19 20:11:19 【问题描述】:我看到当你想在你的 pygame 显示器上显示一个 .png 图像时,FPS 从 60 下降到 20,有没有办法解决这个问题,或者我在代码中做错了什么?
编辑:我刚刚尝试了 .convert_alpha(),它现在大约 40 FPS
menu = pygame.image.load("Ecran titre\\principal\\menu.png")
clock = pygame.time.Clock()
gameExit = False
while not gameExit :
for event in pygame.event.get():
if (event.type == pygame.QUIT):
gameExit = True
#gameDisplay.fill(0)
gameDisplay.blit(background,(0,0)) # background is a jpeg image with .convert()
gameDisplay.blit(menu,(0,0))
pygame.display.update()
clock.tick(60)
pygame.display.set_caption("fps: " + str(clock.get_fps()))
【问题讨论】:
【参考方案1】:convert_alpha() 是在 pygame 中管理图像的良好第一步。同样重要的是要知道将图像blitting 到surface 比将surface blitting 到surface 要慢得多。我会将您计划使用的所有图像预先绘制到它们自己的表面上。然后我会将这些表面粘贴到屏幕上。例如,以下代码发生在游戏循环之外:
img_rect = get_image("my_image.png").get_rect()
img_surface = pygame.Surface((img_rect.width, img_rect.height), pygame.SRCALPHA)
img_surface.fill((0, 0, 0, 0))
img_surface.blit(get_image("my_image.png"), img_rect)
然后进入游戏循环:
gameDisplay.blit(img_surface, (x, y))
一般来说,您希望尽可能多地退出游戏循环。在这种情况下,您正在预处理图像并执行更快的表面到表面 blit。
将来,考虑使用 cProfile for python。它真的会帮助你确定究竟是什么让你的代码变得迟缓。这里有一些很好的信息:
Python getting meaningful results from cProfile
【讨论】:
【参考方案2】:首先,您应该使用.convert_alpha()
,就像之前的答案中所说的“The4thIceman”。这确实可以加快您的代码速度,并且应该在所有加载的图像上使用它。
其次,你应该使用多线程。多线程是使您的程序同时运行多个事物的艺术。 Python 有一个内置的“线程”库(虽然我认为它是 Python 3 中的“_thread”),让您可以轻松地做到这一点。
参考https://docs.python.org/3/library/_thread.html
【讨论】:
以上是关于.png 使 pygame 变得迟钝的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Pygame 中将具有一定透明度的 PNG 粘贴到表面上? [复制]
Python碰撞使用pygame检测图像(图像类型:png)