2012-12-18 44 views
5

Tôi đã viết automaton di động (Conway's Game of Life) sử dụng Perl và TK, chỉ để cho vui và thực hành. Nó hoạt động tốt với đầu ra console. Khi tôi sử dụng TK, trong phiên bản đầu tiên tôi chỉ cần xóa và thêm các ô mới (hình chữ nhật), và sau khoảng 100 bước chương trình của tôi đã bị chậm lại (khoảng 10 lần). Sau đó, tôi viết lại phần đồ họa: ban đầu tạo ra tất cả 2500 ô (50x50) và sau đó thay đổi màu của chúng thay vì thêm/xóa chúng. Nhưng sau 600-700 bước automaton làm lại của tôi bắt đầu làm chậm quá.Tại sao vải Tk lại quá chậm?

Đây là một tính năng/lỗi của TK hoặc tôi làm điều gì đó sai?

Thay đổi màu sắc bằng cách tag:

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

Tạo lưới:

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 và ngăn chặn vòng lặp:

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

Trả lời

1

Tôi tìm thấy một bài viết về widget tk vải bị chậm với nhiều mặt hàng. Vấn đề âm thanh rất giống với vấn đề của bạn:

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

các giải pháp có thể được sử dụng widget ảnh tk mà cư xử giống như một bitmap. Điều này sẽ là một chút đau đớn để thích nghi với mã của bạn nhưng có vẻ như tiện ích canvas vốn đã chậm với nhiều đối tượng.

+0

Tạo và làm việc với hình ảnh thay vì vẽ hình chữ nhật? Ok, tôi sẽ thử này – spyder

+0

@spyder Canvas là một tiện ích siêu văn bản có cấu trúc. Điều đó thật tuyệt vời, ngoại trừ nó hút ở các pixel riêng lẻ (vì mỗi phần tử đồ họa có một mô hình đối tượng phức tạp). Đối với công việc pixel, hình ảnh ảnh hiệu quả hơn nhiều. –

Các vấn đề liên quan