私は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の開始ボタンが押されると、「アリ」が画面に描画されるまでに非常に時間がかかります。より速く実行できるようにコードを最適化する方法はありますか?実行に最も時間がかかるコードはスプライトの実際の描画です。
おそらく、ループの後に 'pygame.display.update()'を呼び出そうとしていますか? –
問題の一部は、 'pygame'がマルチスレッドをサポートしていないという事実かもしれません。あなたは[this](http://stackoverflow.com/a/7362993/355230)のようなことをする必要があります。 – martineau
ページに示唆されている他の修正が行われた後でもパフォーマンスが問題になる場合は、pyopenglのようなOpenGLバインディングに切り替えることを検討してください。レンダリングコードを大幅に書き直す必要がありますが、ウィンドウの作成、イメージのロード、イベントの処理にはまだpygameを使用できます。 – CodeSurgeon