2012-04-20 42 views
5

Tôi có một ứng dụng vẽ rất nhiều hình chữ nhật nhỏ (khoảng 1 triệu) bằng cách sử dụng GDI + trong C# và hiệu suất là ... không tốt lắm. Tôi hiểu rằng việc xây dựng rất nhiều đối tượng để chuyển chúng đến Graphis.FillRectangle mất một khoảng thời gian. Tôi cũng hiểu rằng tôi không thể tránh điều này nếu thay đổi của Rectangle từ khung này sang khung khác, vì Rectangle được thiết kế để không thay đổi. Câu hỏi của tôi do đó là: có khả năng nào để cải thiện hiệu suất của cuộc gọi vẽ này trừ khi tất cả Rectangle s phải được giả định là hiển thị?Vẽ nhiều hình chữ nhật trong GDI +

Cảm ơn trước, Christoph

+0

Hình chữ nhật instantiating sẽ mất gần như không có thời gian so với cuộc gọi API thực tế. Trong thực tế, Rectangle là một cấu trúc. – usr

+0

Bạn có nghĩa là 1 nghìn hay 1 triệu? –

+0

Có gần như chắc chắn là một cách tốt hơn. Các hình chữ nhật đại diện cho những gì? Bạn đang cố vẽ gì? –

Trả lời

9

tôi khuyên bạn sử dụng biến mảng của cuộc gọi thay vì:

FillRectangles(Brush brush, Rectangle[] rects); 

Nếu điều đó không làm việc cho bạn bởi vì bạn cần bàn chải khác nhau hoặc tương tự, bạn nên nhóm các nguyên thủy của nhà nước (bàn chải) và vẽ các mảng mỗi trong một đi duy nhất. Một thử nghiệm nhanh cho thấy hiệu suất ít nhất ba lần, tức là 300K hình chữ nhật được vẽ riêng lẻ cảm thấy như bị nhòe như hình chữ nhật 1M được vẽ trong một lần.

+1

Điều đó thực sự nhanh hơn nhiều ... – Christoph

+0

FillRectangles is soo slow. có gì nhanh hơn không? không có gì ngạc nhiên khi android đẩy 2d gia tốc vào hệ điều hành, bởi vì nó không phải là công việc phát triển để tăng tốc hình chữ nhật điền .. trên cửa sổ không có khả năng tăng tốc, và bạn bị bỏ lại với một ứng dụng hoạt động kém. đừng lo lắng, vào năm 2050, tôi nghĩ phần cứng PC sẽ đủ nhanh cho chức năng FillRectangles. Tôi sẽ kiên nhẫn chờ đợi. – hamish

+0

sử dụng dotTrace Tôi có thể thấy tất cả các chức năng hoạt động kém ngay cả khi sử dụng phần cứng 2017 nó vẫn hoạt động kém .. chúng bao gồm: FillRectangles, DrawImageUnscaled (GDIPdrawImageI), DrawImage (GdipDrawImageRect) – hamish

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