2012-12-18 6 views
5

私はPerlとTKを使ってセルオートマトン(Conway's Game of Life)を作成しました。それはコンソール出力でうまく動作します。 TKを使用すると、最初のバージョンでは新しいセル(四角形)を削除して追加し、約100ステップ後にプログラムが減速しました(約10回)。その後、私はグラフィックス部分を書き直しました。最初は2500個のセル(50x50)のすべてを作ってから、追加/削除する代わりに色を変えました。しかし、600-700ステップ後に私の再加工されたオートマトンも減速し始める。なぜTkキャンバスがとても遅いのですか?

これはTKの機能/バグですか、何か問題がありますか?タグにより、

変更色:

$canvas->itemconfigure("cell"."$x $y", -fill=>'blue'); 

作成グリッド:

for($y = 0; $y < 50; $y++) 
{ 
    for($x = 0; $x < 50; $x++) 
    { 
     $canvas->createRectangle($x * 10, $y * 10, ($x + 1) * 10, ($y + 1) * 10, -fill=>'white', -tags=>["cell"."$x $y"]); 
    } 
} 

開始と停止ループ:私はTkのキャンバスウィジェットが遅いことについての記事を見つけました

sub start 
{ 
    $repeat = $MainWindow->repeat($speed, sub{&maketurn;}); 
    # Function "maketurn" is not important, it is a simple counting of "alive" cells 
    # and changing color by tag 
} 

sub stop 
{ 
    if(defined($repeat)) 
    { 
     $repeat->cancel(); 
    } 
} 

答えて

1

多くのアイテムがあります。問題は、あなたの問題に非常に似て聞こえる:

http://code.activestate.com/lists/perl-tk/17282/

ソリューションは、多くのビットマップのように振る舞うTK写真ウィジェットを使用することであってもよいです。これはあなたのコードを適応させるのに苦労するかもしれませんが、キャンバスウィジェットは本質的に多くのオブジェクトで遅いようです。

+0

描画矩形の代わりにイメージを作成して作業しますか?さて、私はこれを試してみます – spyder

+0

@spyderキャンバスは構造化されたhypergraphicsウィジェットです。それは個々のピクセルを吸うという点を除いて素晴らしいです(各グラフィックス要素には複雑なオブジェクトモデルがあります)。ピクセル作業の場合、写真イメージははるかに効率的です。 –

関連する問題