.png 使 pygame 变慢

.png make pygame laggy

我看到当您想将 .png 图像 blit 到 pygame 显示器时,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()))

convert_alpha() 是在 pygame 中管理图像的良好开端。同样重要的是要知道将图像传输到表面比将表面传输到表面要慢得多。我会预先将您计划使用的所有图像绘制到它们自己的表面上。然后我会将这些表面 blit 到屏幕上。例如,下面的代码发生在游戏循环之外:

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 用于 python。它将真正帮助您确定到底是什么让您的代码运行缓慢。这里有一些很好的信息:

Python getting meaningful results from cProfile

首先,你应该使用.convert_alpha(),就像之前回答中提到的"The4thIceman"。这确实可以加速您的代码,它应该用于所有加载的图像。

其次,你应该使用多线程。多线程是让您的程序 运行 同时处理多个事物的艺术。 Python 有一个内置的 "thread" 库(虽然我认为它是 Python 3 中的“_thread”)可以让你轻松地做到这一点。

参考https://docs.python.org/3/library/_thread.html