为什么Tk画布如此缓慢?

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();
    }
}
1个回答

1

我发现了一篇关于tk画布小部件在有许多物品的情况下运行缓慢的文章。这个问题听起来与你的问题非常相似:

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

解决方案可能是使用 tk photo widget,它的行为很像位图。这可能需要一些调整代码的痛苦,但似乎画布小部件在处理许多对象时本质上是缓慢的。

创建并使用图像而不是绘制矩形?好的,我会尝试这个。 - spyder
@spyder 画布是一个结构化的超图形小部件。这很棒,但对于单个像素它并不擅长(因为每个图形元素都有一个复杂的对象模型)。对于像素工作,照片图像更加高效。 - Donal Fellows
那个URL现在返回404错误。 - Bryan Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接