【发布时间】: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