5

Perl と TK を使用してセル オートマトン (コンウェイのライフ ゲーム) を書いたのは、ただの楽しみと練習のためです。コンソール出力で問題なく動作します。TK を使用する場合、最初のバージョンでは新しいセル (四角形) を削除して追加するだけで、約 100 ステップ後にプログラムの速度が低下しました (約 10 倍)。次に、グラフィックス部分を書き直しました。最初は2500セル(50x50)をすべて作成し、追加/削除する代わりに色を変更しました。しかし、600 ~ 700 ステップを過ぎると、作り直したオートマトンも遅くなり始めます。

これは 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"]);
    }
}

ループの開始と停止:

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();
    }
}
4

1 に答える 1

1

tk キャンバス ウィジェットが多くの項目で遅いという記事を見つけました。問題はあなたの問題と非常によく似ています:

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

解決策は、ビットマップのように動作する tk フォト ウィジェットを使用することです。これは、コードを適応させるのに少し苦労しますが、キャンバス ウィジェットは多くのオブジェクトで本質的に遅いようです。

于 2012-12-18T04:57:34.263 に答える