2016-10-22 66 views
0

我使用tkinter和Pygame创建了一个模拟,我目前在优化我的代码时遇到了问题。该方案需要借鉴500-1000“蚁族”精灵的表面 - 这些蚂蚁的行为由此类Pygame代码太慢了

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,粒子的实例被创建,如下所示:

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中的启动按钮被按下时,“蚂蚁”被拖到屏幕上需要很长时间。有什么方法可以优化代码,使其运行速度更快?最长执行的代码是精灵在屏幕上的实际绘制。

+4

也许尝试在循环后调用'pygame.display.update()'? –

+0

问题的一部分可能是'pygame'不支持多线程。您可能需要执行类似[this](http://stackoverflow.com/a/7362993/355230)的操作。 – martineau

+0

如果在页面上建议的其他修复之后性能仍然是问题,那么可以考虑切换到OpenGL绑定,如pyopengl,这是3d硬件加速,以显着提升性能。这将需要重新编写渲染代码,尽管您仍然可以使用pygame创建窗口,加载图像和处理事件。 – CodeSurgeon

回答

1

我还没有得到足够的+代表发表意见,但要加载图像的有效方式是这样写的:pygame.image.load(ANT_SPRITE_PATH).convert_alpha()

让我知道,如果你提升性能!

+1

这工作完美!它在大约2秒内渲染了精灵,而不是30-40秒。 – joyalrj22

+0

编辑:我的意思是10秒 – joyalrj22

+0

很高兴帮助!希望一切顺利 :) –