2012-12-18 8 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 캔버스는 구조화 된 하이퍼 그래프 위젯입니다. 각 픽셀 요소가 복잡한 개체 모델을 가지고 있기 때문에 개별 픽셀을 망칠뿐입니다. 픽셀 작업의 경우 사진 이미지가 훨씬 효율적입니다. –

관련 문제