2012-12-18 37 views
5

Eğlence ve pratik için Perl ve TK kullanarak hücresel otomatı (Conway'in Hayat Oyunu) yazdım. Konsol çıkışı ile iyi çalışıyor. TK kullandığımda, ilk sürümde sadece yeni hücreleri (dikdörtgenler) silip ekliyorum ve yaklaşık 100 adımdan sonra programım yavaşladı (yaklaşık 10 kez). Ardından grafik bölümünü yeniden yazdım: başlangıçta 2500 hücrenin tamamını (50x50) yaptı ve ardından onları ekleyip silmek yerine renklerini değiştirdi. Fakat 600-700 adımları geçtikten sonra yeniden işlenmiş otomatım da yavaşlamaya başlar.Tk kanvas neden bu kadar yavaş?

Bu, TK'nin bir özelliği/hatası mı, yoksa yanlış bir şey mi yapıyorum? Etikete göre

değiştirme rengi:

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

oluşturma ızgara:

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 ve stop döngü: Ben tk tuval Widget yavaş olmakla ilgili bir makale bulunamadı

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

cevap

1

birçok öğe ile. Sorun sorununuza çok benzer sesler:

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

çözüm çok bir bitmap gibi davranır tk fotoğraf widget'ı kullanmak olabilir. Bu, kodunuzu adapte etmek için biraz acı çeker ama tuval widget'ının doğal olarak birçok nesne ile yavaşlattığı anlaşılıyor.

+0

Dikdörtgenler çizmek yerine bir görüntü oluşturup bunlarla çalışmak ister misiniz? Tamam, bunu deneyeceğim – spyder

+0

@spyder Tuval, yapısal bir hipergrafik pencere öğesidir. Bu harika, tek tek pikselleri emmek dışında (her grafik öğesi karmaşık bir nesne modeline sahip olduğu için). Piksel çalışması için bir fotoğraf resmi çok daha verimli. –

İlgili konular