2016-10-22 6 views
0

私はtkinterとPygameを使ってsimlationを作成していますが、現在私のコードを最適化するのに問題があります。プログラムは、表面に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は、パーティクルのインスタンスがそうのように作成されます。

Tkinterでは「スタート」ボタンは、次のコードが実行される押されたpygameのウィンドウのイベントループに
self.ants = [Particle('black',1,1) for x in range(500)] 

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

ページに示唆されている他の修正が行われた後でもパフォーマンスが問題になる場合は、pyopenglのようなOpenGLバインディングに切り替えることを検討してください。レンダリングコードを大幅に書き直す必要がありますが、ウィンドウの作成、イメージのロード、イベントの処理にはまだpygameを使用できます。 – CodeSurgeon

答えて

1

は、私がコメントするのに十分な+担当者を得ていないが、ロード・イメージへの効率的な方法は次のように書かれている:それはあなたのパフォーマンスを押し上げた場合pygame.image.load(ANT_SPRITE_PATH).convert_alpha()

は、私を知ってみましょう!

+1

これは完全に機能しました!それはスプライトを30秒〜40秒ではなく約2秒でレンダリングしました。 – joyalrj22

+0

編集:私は10駒を意味しました – joyalrj22

+0

喜んで助けて!それがすべてうまくいくことを願って:) –