2012-02-13 36 views
8

Tôi đang cố gắng hiểu tại sao hình ảnh của tôi không linh hoạt, vì vậy tôi đã xây dựng một mẫu để kiểm tra hiệu suất WPF. Tôi đã sử dụng bộ hẹn giờ để tính toán trình xử lý sự kiện "hình ảnh hiển thị" của tôi được xử lý trong bao lâu và đã sử dụng đồng hồ dừng để đo thời gian để hình ảnh xuất hiện trên màn hình. Điểm mấu chốt: khi hiển thị hình ảnh 100, 1600, 2500 và 3600, WPF mất 2, 9, 12 và 16 giây sau mã của tôi đã hoàn thành để hiển thị hình ảnh trên màn hình. Vì vậy, tôi cảm thấy bất lực: Có vẻ như tôi không thể cải thiện mã của mình để làm cho hình ảnh xuất hiện nhanh hơn - tôi cần phải làm điều gì đó với WPF!Hiệu suất bitmap WPF

Vì vậy, câu hỏi của tôi là: Tôi cần làm gì khác để làm cho hình ảnh hiển thị nhanh hơn?


Các thiết lập thử nghiệm rất đơn giản:

Cửa sổ chứa một Grid. Sau khi nút "test" được nhấp, chèo và định nghĩa cột là added.Then một hình ảnh được thêm vào mỗi tế bào của lưới điện như sau:

  var image = new Image(); 
      image.BeginInit(); 
      image.Name = ImageNameFromCell(theRow, theColumn); 
      image.Stretch = Stretch.None; 
      image.HorizontalAlignment = HorizontalAlignment.Center; 
      image.VerticalAlignment = VerticalAlignment.Center; 
      RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.LowQuality); 
      image.EndInit(); 

      theGrid.Children.Add(image); 

Cuối cùng, Nguồn của mỗi hình ảnh được đặt thành một bitmap: một hình ảnh tỷ lệ màu xám đã được thu nhỏ xuống kích thước màn hình ước tính. Các bitmap được tạo ra như sau:

  var smallerBitmapImage = new BitmapImage(); 
      smallerBitmapImage.BeginInit(); 
      smallerBitmapImage.DecodePixelWidth = (int)(theImageWidth); 
      smallerBitmapImage.UriSource = theUri; 
      smallerBitmapImage.CacheOption = BitmapCacheOption.None; 
      smallerBitmapImage.EndInit(); 

      //BitmapFrame bitmapFrame = BitmapFrame.Create(this.FullPath); 

      var convertedBitmap = new FormatConvertedBitmap(); 
      convertedBitmap.BeginInit(); 
      convertedBitmap.Source = smallerBitmapImage; 
      convertedBitmap.DestinationFormat = PixelFormats.Gray16; 
      convertedBitmap.EndInit(); 
      convertedBitmap.Freeze(); 

Vì vậy, tôi đang ở trí thông minh của tôi kết thúc. Những hình ảnh xuất hiện với một sự chậm trễ đáng chú ý, và nó có vẻ là ngoài tầm kiểm soát của tôi. Tôi có thể làm gì?

Trả lời

3

gì dường như đã làm cho phần chênh lệch được thiết lập tùy chọn bộ nhớ cache của hình ảnh để onload

smallerBitmapImage.CacheOption = BitmapCacheOption.OnLoad;

Điều này đã chuyển công việc đến trình xử lý sự kiện của tôi, vì vậy giờ đây tôi có thể sử dụng tính năng tìm nạp trước để thực hiện việc này ở chế độ nền.

3

Bạn có thực sự nhìn thấy tất cả những hình ảnh đó cùng một lúc không? Nếu không, bạn có thể sử dụng một số ItemsControl với bảng điều khiển ảo hóa để chỉ hiển thị hình ảnh trong chế độ xem. (Nói về các bảng, thiết lập hiện tại của bạn cũng có thể được thay thế bằng một số ItemsControl sử dụng UniformGridpanel)

Bạn cũng có thể thử viết bộ giải mã tốt hơn, có thể là một nỗ lực lãng phí.

+0

Cảm ơn câu trả lời của bạn, H.B. Vâng, tôi muốn xem tất cả những hình ảnh đó cùng một lúc. Các trường hợp 1600, 2500 và 3600 là để thử nghiệm, vì vậy tôi có thể đo sự chậm trễ của WPF dễ dàng với một giây của đồng hồ, nhưng tôi muốn nói rằng 400 hình ảnh là một số tôi muốn hỗ trợ. Và tái "giải mã tốt hơn" sugestion, tôi nghĩ giải mã đã được thực hiện trong "smallBitmapImage" mã trên, tức là trong mã của tôi và không phải trong thời gian WPF làm bất cứ điều gì nó sau khi xử lý sự kiện của tôi trở về, đó là thời gian tôi đang cố gắng rút ngắn ... – Avi

+1

@Avi: Oh đúng, như các tập tin có lẽ là địa phương giải mã có thể xảy ra đồng bộ nhưng tôi không chắc chắn về internals; cho rằng chuyển đổi không ném ngoại lệ mà giả định có vẻ khả thi mặc dù. Nếu điều này xảy ra với thời gian hiển thị thuần túy, bạn thực sự có thể bị ràng buộc vì dường như bạn đã làm mọi thứ có thể tăng tốc độ từ việc giải mã đến kích thước nhỏ hơn để ngăn ngừa việc mở rộng quy mô. Không biết những gì khác bạn có thể làm ở đây: ( –