2012-12-18 13 views
5

Napisałem automat komórkowy (Gra życia Conwaya) używając Perla i TK, tylko dla zabawy i ćwiczeń. Działa dobrze z wyjściem konsoli. Kiedy używam TK, w pierwszej wersji po prostu kasuję i dodam nowe komórki (prostokąty), a po około 100 krokach mój program zwolnił (około 10 razy). Potem przerobiłem część graficzną: początkowo wykonałem wszystkie 2500 komórek (50x50), a następnie zmieniłem ich kolor zamiast dodawać/usuwać. Ale po 600-700 krokach mój przerobiony automat zaczyna zwalniać.Dlaczego płótno TK jest takie wolne?

To jest funkcja/błąd TK lub coś robię źle?

Zmiana koloru etykiet:

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

Tworzenie sieci:

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

start i stop pętla:

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

Odpowiedz

1

Znalazłem artykuły o widżet tk płótno jest powolny z wieloma przedmiotami. Problem brzmi bardzo podobny do Twojego problemu:

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

Rozwiązaniem może być użycie widget tk zdjęć, które zachowuje się podobnie jak bitmapy. Byłoby trochę trudności z dostosowaniem twojego kodu, ale wydaje się, że widżet kanwy jest z natury wolny z wieloma obiektami.

+0

Tworzenie i praca z obrazem zamiast rysowania prostokątów? Ok, spróbuję tego – spyder

+0

@spyder Płaszczyzna jest strukturalnym widgetem hipergraphicznym. To świetnie, z wyjątkiem zasysania pojedynczych pikseli (ponieważ każdy element graficzny ma złożony model obiektu). W przypadku pracy z pikselami zdjęcie jest znacznie bardziej wydajne. –

Powiązane problemy