【问题标题】:Pygame code is too slowPygame 代码太慢
【发布时间】:2016-10-22 21:10:45
【问题描述】:

我正在使用 tkinter 和 Pygame 创建一个模拟,我目前无法优化我的代码。程序需要将 500-1000 个“蚂蚁”精灵绘制到表面 - 这些蚂蚁的行为由此类定义

class Particle(pygame.sprite.Sprite):

    def __init__(self,color,width,height):
        # call parent class constructor
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(ANT_SPRITE_PATH)

        self.rect = self.image.get_rect()
        self.WIDTH = width
        self.HEIGHT = height

    def updatePos(self,pos):
        self.rect.x = pos[0]
        self.rect.y = pos[1]

在另一个类 PyGameWin 的初始化中,Particle 的实例是这样创建的:

self.ants = [Particle('black',1,1) for x in range(500)]

在 pygame 窗口的事件循环中,当按下 tkinter 中的“开始”按钮时,将执行以下代码:

t = threading.Thread(target=self.startAntMotion)
t.start()

其中 startAntMotion() 定义如下:

def startAntMotion(self):
    for ant in self.ants[0:100]:
        ant.updatePos(self.start)
        self.surface.blit(ant.image,ant.rect)

        pygame.display.update()

我打算将来为 self.ants 中剩余的 400 个对象添加更多线程。当程序运行并按下 tkinter 中的开始按钮时,“蚂蚁”需要很长时间才能被绘制到屏幕上。有什么办法可以优化代码,让它运行得更快吗?执行时间最长的代码是将精灵实际绘制到屏幕上。

【问题讨论】:

  • 也许尝试在循环后调用pygame.display.update()
  • 部分问题可能是pygame 不支持多线程。您可能需要执行类似this 的操作。
  • 如果在页面上建议的其他修复之后性能仍然存在问题,您可以考虑切换到 OpenGL 绑定,例如 pyopengl,它是 3D 硬件加速的,以显着提升性能。尽管您仍然可以使用 pygame 创建窗口、加载图像和处理事件,但这将需要对渲染代码进行大量重写。

标签: python multithreading oop tkinter pygame


【解决方案1】:

我没有足够的 +rep 评论,但是,加载图像的有效方法是这样写的:pygame.image.load(ANT_SPRITE_PATH).convert_alpha()

让我知道这是否提高了你的表现!

【讨论】:

  • 这很完美!它在大约 2 秒内渲染了精灵,而不是 30-40 秒。
  • 编辑:我的意思是 10 ssconds
  • 很高兴能帮上忙!希望一切顺利:)
猜你喜欢
  • 2020-04-23
  • 2017-11-14
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多