2010-04-23 32 views
9

Có một đơn giản MSDN example về WriteableBitmap.Wpf: Tại sao WriteableBitmap trở nên chậm hơn?

Nó cho thấy cách vẽ đường tự do bằng con trỏ bằng cách chỉ cập nhật một pixel khi chuột được nhấn và di chuyển qua Điều khiển WPF-Hình ảnh.

writeableBitmap.Lock(); 
(...set the writeableBitmap.BackBuffers pixel value...) 
writeableBitmap.AddDirtyRect(new Int32Rect(column, row, 1, 1)); 
writeableBitmap.Unlock(); 

Bây giờ tôi đang cố gắng để hiểu được những hành vi sau khi di chuyển con trỏ chuột rất nhanh:

Nếu kích thước hình ảnh/bitmap là ví dụ tương đối nhỏ 800: 600 pixel, sau đó điểm ảnh được vẽ cuối cùng luôn được "đồng bộ hóa" với vị trí con trỏ chuột, tức là không có sự chậm trễ, phản ứng rất nhanh trên các chuyển động của chuột.

Nhưng nếu bitmap lớn hơn, ví dụ: 1300: 1050 pixel, bạn có thể nhận thấy độ trễ, điểm ảnh được rút cuối cùng luôn xuất hiện một chút chậm trễ sau con trỏ chuột di chuyển.

Vì vậy, trong cả hai trường hợp, chỉ một pixel được cập nhật với "AddDirtyRect", tốc độ phản ứng phải độc lập với kích thước bitmap !? Nhưng có vẻ như Writeablebitmap chậm hơn khi kích thước của nó lớn hơn.

Hoặc thực hiện toàn bộ bitmap bằng cách nào đó sẽ được chuyển sang thiết bị đồ họa trên mọi cuộc gọi writeableBitmap.Unlock(); và không chỉ khu vực hình chữ nhật được định sẵn theo phương pháp AddDirtyRect?

Fritz

Trả lời

4

Có một lỗi trong WriteableBitmap cho WPF trong Net 3.5 gây ra bất kỳ cuộc gọi đến AddDirtyRect để vô hiệu hóa toàn bộ hình ảnh, không chỉ là khu vực hình chữ nhật.

Nó được cho là đã được cố định trong Net 4.0

Xem http://social.msdn.microsoft.com/Forums/en-US/wpfprerelease/thread/1b84e451-9698-431f-9c51-078825a729b5

+0

Nhưng tôi thấy rằng một người nào đó trong chủ đề đó vẫn đang trải qua các sản phẩm hoàn hảo, vì vậy có ai thực sự xác nhận rằng nó đã được sửa chưa? –

+0

Hiện tại nó xuất hiện WriteableBitmap vẫn có vấn đề về hiệu suất. Tôi sử dụng AddDirtyRect như fritz để thay đổi chỉ các pixel cần thay đổi, nhưng hình ảnh càng lớn thì tốc độ càng chậm. Tôi đang sử dụng .NET 4.6, bằng cách này: /. –

4

Trong Net 4, bitmap writeable vẫn làm mất hiệu lực toàn bộ khu vực không có vấn đề mà bạn thêm một rect bẩn. Bạn có thể xác nhận điều này bằng cách sử dụng Perforator, một phần của Bộ công cụ hiệu năng Windows đi kèm với Windows SDK phiên bản 7.1.

Đây là lỗi hiệu suất chính.

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