.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 运行几秒钟后变得无响应

如何在 Pygame 中将具有一定透明度的 PNG 粘贴到表面上? [复制]

Python碰撞使用pygame检测图像(图像类型:png)

libpng 警告:在 Python/PyGame 中使用 png_read_image 时应打开隔行处理

如何使用 pygame 在 Python 中保持 png 图像的透明度? [复制]